Php &引用;“未找到类”;我错过了什么?
我想向模型添加访问器和变异器。在Laravel4中,一切都很好,但在Laravel5中,我遇到了一些麻烦。 我的应用程序目录中有一个“lib”文件夹,其中包含“db_transformers.php”文件。该文件包含类似“dbDate”的类,其中包含一个set和get函数,用于将数据库中存储的日期转换为用户友好的格式 “db_transformers.php”文件的名称空间为:Php &引用;“未找到类”;我错过了什么?,php,laravel,laravel-4,laravel-5,Php,Laravel,Laravel 4,Laravel 5,我想向模型添加访问器和变异器。在Laravel4中,一切都很好,但在Laravel5中,我遇到了一些麻烦。 我的应用程序目录中有一个“lib”文件夹,其中包含“db_transformers.php”文件。该文件包含类似“dbDate”的类,其中包含一个set和get函数,用于将数据库中存储的日期转换为用户友好的格式 “db_transformers.php”文件的名称空间为: <?php namespace App\lib; 但我的方法仍然会出错: public functio
<?php namespace App\lib;
但我的方法仍然会出错:
public function getDateTimeAttribute($value)
{
return dbDate::get($value);
}
这将返回“类”App\dbDate“未找到”错误
我可能有什么问题?您需要使用完整的类名:
使用App\lib\dbDate代码>
您还可以考虑为此使用视图装饰器,因为在您的模型中这样做确实不合适
有几个软件包可以帮助实现这一点,例如,您将自动加载(PHP包括/需要类定义文件)与名称空间(一个允许PHP类/函数分层命名以帮助防止代码冲突的系统)混淆了
这是一件容易做的事。在Laravel 5中介绍对自动加载的更改超出了堆栈溢出问题的范围,但是如果您感兴趣,我已经在上面写了多篇文章系列
对于您的特定问题,您说您已经在名为db\u transformers.php
的文件中定义了一个名为dbDate
的类,并且db\u transformers.php
的命名空间为App\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关键字将特定类导入当前命名空间。当你说
use App\lib;
你在告诉我
您知道全局类App\lib
?下面我将把它称为lib
因为您没有名为lib
的类,所以这是没有意义的,这就是为什么您的use
没有帮助的原因
这就是名称空间。您需要解决的另一个问题是自动加载。当您希望在项目中包含类定义文件时,自动加载允许您跳过require
或include
语句/函数
Laravel4使用了一系列不同的自动加载器,包括一个叫做classmap
autoloader的东西。classmap autoloader自动解析项目中的所有文件以查找类,并创建一个巨大的类在何处的映射(这有点过于简化了,请参阅前面的I链接以了解完整细节)
在Laravel4中,classmap
autoloader可能会为您读取lib
中的文件,其中包括取消大多数文件夹的类映射自动加载程序
在Laravel5中可以做的最简单的事情是将项目配置为再次使用ClassMapAutoloader。打开composer.json
并找到此部分
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
并将lib
添加到classmap
autoloader部分
"autoload": {
"classmap": [
"database",
"lib"
],
"psr-4": {
"App\\": "app/"
}
},
这会告诉composer在创建其自动加载文件时包含lib
文件夹。您需要运行dumpautoload
命令
composer dump-autoload
这样做之后,您应该能够按照自己的意愿使用lib/db_transformers.php
中定义的类 试试作曲者dump,我什么都不做……谢谢你,很好的解释:)我从你的回答中学到了很多!只有一点,我在类映射中添加了“app/lib”,而不是“app”。)再次感谢:)
composer dump-autoload