未找到 Laravel 自定义特征
Posted
技术标签:
【中文标题】未找到 Laravel 自定义特征【英文标题】:Laravel Custom Trait Not Found 【发布时间】:2016-09-27 11:17:42 【问题描述】:我对特质不熟悉,但我想尝试一下。但是,它似乎没有加载。
我在 Laravel 应用程序目录下的文件夹中创建了一个 trait:app\Helpers 名为 CheckPermsAgainstObjectTrait.php
这是特征代码:
<?php
namespace App\Helpers;
trait CheckPermsAgainstObjectTrait
function something
我尝试在控制器中使用它:
<?php
namespace App\Http\Controllers;
use this&that;
use App\Helpers\CheckPermsAgainstObjectTrait;
class PolicyController extends Controller
use CheckPermsAgainstObjectTrait;
该目录中的类可以正常加载。 PHPStorm 认为这个特征很好。我已经清除了编译的 aritsan 并转储了自动加载。我猜 Laravel 不喜欢命名空间?我希望我不需要在作曲家中进行任何手动加载——但我无法找到任何文档来提示我正在搞砸什么。
错误:
FatalErrorException in PolicyController.php line 15:
Trait 'App\Helpers\CheckPermsAgainstObjectTrait' not found
有什么想法吗?
【问题讨论】:
composer.json 显示的 PSR-4 部分是什么? @Devon PSR-4 只是标准的 Laravel: "App\\": "app/" 我找不到需要以不同于类的方式加载特征 - 是案例? 不,应该没问题。特征、类、接口都应该与 composer 一样工作。我假设某处有错字,可能在文件名中。只需确保 app/Helpers/CheckPermsAgainstObjectTrait.php 确实存在。 呸!!就是这样!哇,我不得不去 SO 寻求帮助以找出一个错字。该类被命名为 Ojbect。 @Devon,谢谢。 【参考方案1】:您是否转储了自动加载文件?
composer dump-autoload
【讨论】:
如果可能的话最好使用php artisan dump-autoload
解释作曲家转储自动加载
php artisan dump-autoload
在某个时候存在,对here 答案之一的评论说它已被弃用。但是,该命令仍然存在于我的 Laravel 5.5 项目中。
composer dump-autoload --optimize
解决了我的问题,也许你可以考虑。【参考方案2】:
我的答案是,由于使用 Laravel 特征作为示例,我的特征文件顶部的命名空间有误。如果您的 trait 在 App/Traits/MyTrait.php
中,请确保您的命名空间是:
namespace App\Traits;
trait MyTrait
// ..
然后从包含特征的文件中:
use App\Traits\MyTrait;
class MyClass
use MyTrait;
// ..
无需搞乱config/app.php
、composer.json
或自动加载。
【讨论】:
【参考方案3】:我遇到了一个非常相似的问题,我在使用 phpunit
运行测试时收到错误 Trait 'Tests\CreatesApplication' not found in '.../my_project/tests/TestCase.php' on line 9
,因为我手动更新了我的 Laravel 项目,并且一定错过了一些更改。这也可能发生在任何在唯一命名空间中创建特征或类的人身上。
无论如何,@Devon 对原始问题的评论为我指明了正确的方向。
我的composer.json
文件中缺少所需的自动加载器配置,因此我从Laravel github repository 检查了我的 Laravel 版本(在本例中为 5.4)应该是什么。
在这种情况下,我不是从 App\
中的命名空间调用(它已经在 composer.json
中。)
这是我在composer.json
中遗漏的内容:
...,
"autoload-dev":
"psr-4":
"Tests\\": "tests/"
,
...
感谢Devon!希望这可以防止其他人拔头发。
【讨论】:
【参考方案4】:composer dumpautoload -o
这对我有用
【讨论】:
【参考方案5】:当您的 Trait 文件名拼写错误或与类名一样不正确时,有时可能会发生这种情况。请检查您的文件名是否与类名相同
【讨论】:
以上是关于未找到 Laravel 自定义特征的主要内容,如果未能解决你的问题,请参考以下文章