2015-04-03 157 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

相关问题