我对特质很新,但我想我试一试。但是,它似乎没有加载。
我在Laravel app目录下的文件夹中创建了一个特征: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和dumpol autoload。我猜是Laravel对命名空间有什么不喜欢的东西?我希望我不需要在作曲家中进行任何手动加载 - 但是我找不到任何文档给我一个关于我搞砸了什么的提示。
错误:
FatalErrorException in PolicyController.php line 15:
Trait 'App\Helpers\CheckPermsAgainstObjectTrait' not found
有什么想法吗?
答案 0 :(得分:5)
您是否转储了自动加载文件?
composer dump-autoload
答案 1 :(得分:3)
我的答案是,由于以Laravel特征为例,我的特征文件顶部有一个错误的命名空间。如果您的特征在App/Traits/MyTrait.php
,那么请确保您的命名空间为:
namespace App\Traits;
trait MyTrait
{
// ..
}
然后从包含特征的文件中
use App\Traits\MyTrait;
class MyClass
{
use MyTrait;
// ..
}
无需混淆config/app.php
,composer.json
或自动加载。
答案 2 :(得分:1)
我遇到一个非常类似的问题,我在使用Trait 'Tests\CreatesApplication' not found in '.../my_project/tests/TestCase.php' on line 9
运行测试时收到错误phpunit
,因为我手动更新了我的Laravel项目并且一定错过了一些更改。任何在唯一命名空间中创建特征或类的人都可能会遇到这种情况。
无论如何,@ Devon对原始问题的评论指出了我正确的方向。
我在composer.json
文件中缺少所需的自动加载器配置,因此我从Laravel github repository检查了我的Laravel版本(本例中为5.4)应该是什么。
在这种情况下,我没有从App\
中的名称空间调用(已经在composer.json
中。)
这是我在composer.json
中遗漏的内容:
{
...,
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
...
}
谢谢Devon!希望这能阻止其他人拔掉头发。
答案 3 :(得分:1)
composer dumpautoload -o
这对我有用