我想将Accessors和Mutators添加到模型中。在Laravel 4中它运行得很好,但是在Laravel 5中我遇到了麻烦。 我有一个" lib"我的App目录中的文件夹,其中包含" db_transformers.php"文件。这个文件包含" dbDate"等类。使用set和get函数将存储在数据库中的日期转换为用户友好的格式。
" db_transformers.php" file是命名空间:
<?php namespace App\lib;
我还会转到我模型中的文件夹:
use App\lib;
但是我的方法仍然会抛出错误:
public function getDateTimeAttribute($value)
{
return dbDate::get($value);
}
这将返回&#34; Class&#39; App \ dbDate&#39;找不到&#34;错误。
可能是我的问题?
答案 0 :(得分:2)
您将自动加载(包括/需要类定义文件的PHP)与名称空间(允许PHP类/函数的分层命名以帮助防止代码冲突的系统)混淆。
这很容易做到。覆盖Laravel 5中自动加载的更改超出了Stack Overflow问题的范围,但如果您感兴趣我已经在how autoloading works with composer/Laravel 4/Laravel 5上撰写了多篇文章系列。
对于您的具体问题,您说您已在名为dbDate
的文件中定义了名为db_transformers.php
的类,而db_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 App\lib;
你在告诉PHP
你知道全球班
App\lib
吗?我将在下面将其称为lib
由于您没有名为lib
的课程,这是毫无意义的,这就是您use
没有帮助的原因。
这就是命名空间。您需要解决的另一个问题是自动加载。当您需要项目中的类定义文件时,自动加载可以让您跳过require
或include
语句/函数。
Laravel 4使用了许多不同的自动加载器,包括称为classmap
自动加载器的东西。 classmap自动加载器自动解析项目中寻找类的所有文件,并创建一个巨型地图,其中哪个类在哪里(这有点过于简化它,请参阅我之前链接的article series以获取完整的详细信息)。
在Laravel 4中,classmap
自动加载器可能会为lib
读取composer.json
中的文件。 Laravel 5 reduced the number of autoloaders,其中包括删除大多数文件夹的classmap自动加载器。
您在Laravel 5中可以做的最简单的事情是将项目配置为再次使用classmap自动加载器。打开 "autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/"
}
},
并找到此部分
lib
并将classmap
添加到 "autoload": {
"classmap": [
"database",
"lib"
],
"psr-4": {
"App\\": "app/"
}
},
自动加载器部分
lib
这会告诉作曲家在创建自动加载器文件时包含dumpautoload
个文件夹。您需要运行composer dump-autoload
命令
lib/db_transformers.php
执行此操作后,您应该可以根据需要使用{{1}}中定义的类。
答案 1 :(得分:0)
您需要使用完整的班级名称:use App\lib\dbDate;
您可能也会考虑使用视图装饰器,因为在模型中执行它实际上是不合适的。
有几个软件包可以帮助解决这个问题,例如: https://github.com/ShawnMcCool/laravel-auto-presenter