2015-04-03 153 views
-1

我想將Accessors和Mutators添加到模型中。在Laravel 4中它工作得很好,但對於Laravel 5我有一些麻煩。 我有一個「LIB」文件夾中包含了「db_transformers.php」文件我的應用程序目錄。這個文件包含像「dbDate」這樣的類,並帶有一組函數,用於將存儲在數據庫中的日期轉換爲用戶友好的格式。「Class not found」我錯過了什麼?

的 「db_transformers.php」 文件命名空間:

<?php namespace App\lib;  

我也rerfer在我的模型的文件夾:

use App\lib; 

但我仍然methodes拋出錯誤:

public function getDateTimeAttribute($value) 
{ 
    return dbDate::get($value); 
} 

這將返回一個「類‘應用\ DBDATE’未找到」錯誤。

可能是我的問題?

+0

嘗試作曲家dump-autoload – Ymartin 2015-04-03 20:04:34

+0

什麼都不做...... – LuMa 2015-04-03 20:08:42

回答

2

你在自動加載(包括/需要類定義文件的PHP)與名稱空間(允許PHP類/函數的分層命名以幫助防止代碼衝突的系統)混淆。

這是一個容易的事。覆蓋變化Laravel 5到自動加載超出了堆棧溢出問題的範圍,但如果你有興趣,我寫上how autoloading works with composer/Laravel 4/Laravel 5多個系列文章。

爲了您的具體問題,你說你已經定義了一個名爲dbDate在一個名爲db_transformers.php文件類,而db_transformers.phpApp\lib命名空間。

#File: lib/db_transformers.php 
namespace App\lib; 
//other code 
class dbDate 
{ 
    //other code 
} 
//other code 

這意味着你的班級的全名是App\lib\dbDate整個事物是課程的名稱。這可能是習慣使用PHP中的命名空間的最大的事情。

這意味着,如果你想使用其他代碼的類,你需要參考類的全名,包括前置反斜槓。

return \App\lib\DbDate::get($value); 

你也可以使用關鍵字use

use App\lib\DbDate; 
//other code 
public function getDateTimeAttribute($value) 
{ 
    //since we imported the class with `use`, we don't need to type the full name 
    return DbDate::get($value); 
} 

使用關鍵字進口特定類到當前的命名空間導入類。當你說

use App\lib; 

你告訴PHP

你知道,全球一流的App\lib?我要提到它下面爲lib

因爲你沒有一個名爲lib類,這是沒有意義的,這就是爲什麼你的use沒有幫助。

這就是命名空間。您需要解決的另一個問題是自動加載。自動加載可以讓您在項目中需要類定義文件時跳過requireinclude語句/函數。

Laravel 4使用了一堆不同的自動加載器,其中包括一種名爲classmap的自動加載器。 classmap autoloader會自動解析項目中所有尋找類的文件,並創建一個巨大的映射圖,哪個類是哪個類的(這簡化了一下,詳見前面鏈接的article series)。

在Laravel 4中,classmap自動加載器可能爲您讀取lib中的文件。 Laravel 5 reduced the number of autoloaders,其中包括擺脫大多數文件夾的類圖自動加載器。

您可以在Laravel 5中執行的最簡單的事情是將您的項目配置爲再次使用類映像自動加載器。打開composer.json,發現這部分

"autoload": { 
      "classmap": [ 
        "database" 
      ], 
      "psr-4": { 
        "App\\": "app/" 
      } 
    }, 

並添加libclassmap自動加載部分

"autoload": { 
      "classmap": [ 
        "database", 
        "lib" 
      ], 
      "psr-4": { 
        "App\\": "app/" 
      } 
    }, 

這告訴作曲家包括當它創建了自動加載文件夾lib。你需要做的是後運行dumpautoload命令

composer dump-autoload 

,你應該能夠爲您希望使用的lib/db_transformers.php定義的類。

+0

謝謝你,很好的解釋:)我從你的答案中學到了很多東西! 只需要一點,我添加了「app/lib」而不是「app」到類圖;) 再次感謝:) – LuMa 2015-04-04 00:04:45

相關問題