"未找到班级"我错过了什么?

时间:2015-04-03 19:58:03

标签: php laravel laravel-4 laravel-5

我想将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;错误。

可能是我的问题?

2 个答案:

答案 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没有帮助的原因。

这就是命名空间。您需要解决的另一个问题是自动加载。当您需要项目中的类定义文件时,自动加载可以让您跳过requireinclude语句/函数。

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