我对特质很陌生,但我想尝试一下。但是,似乎无法加载。
我在 Laravel 应用程序目录下的文件夹中创建了一个名为 CheckPermsAgainstObjectTrait.php 的特征:app\Helpers
这是特征代码:
<?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 dump-autoload
我的答案是,由于以 Laravel 特征为例,我的特征文件顶部的命名空间错误。如果您的特征位于
App/Traits/MyTrait.php
中,请确保您的命名空间是:
namespace App\Traits;
trait MyTrait
{
// ..
}
然后从包含特征的文件中:
use App\Traits\MyTrait;
class MyClass
{
use MyTrait;
// ..
}
无需搞乱
config/app.php
、composer.json
或自动加载。
我遇到了一个非常类似的问题,在使用
Trait 'Tests\CreatesApplication' not found in '.../my_project/tests/TestCase.php' on line 9
运行测试时出现错误 phpunit
,因为我手动更新了我的 Laravel 项目,并且肯定错过了一些更改。这也可能发生在任何在唯一命名空间中创建特征或类的人身上。
无论如何,@Devon 对原始问题的评论为我指明了正确的方向。
我的
composer.json
文件中缺少所需的自动加载器配置,因此我从 Laravel github 存储库 检查了我的 Laravel 版本(本例中为 5.4)的配置。
在这种情况下,我没有从
App\
中的命名空间调用(它已经在 composer.json
中。)
这是我在
composer.json
中缺少的内容:
{
...,
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
...
}
感谢德文郡!希望这可以防止其他人拔掉头发。
composer dumpautoload -o
这对我有用
当您的 Trait 文件名拼写错误或类名不正确时,有时可能会发生这种情况。请检查您的文件名是否与类名相同
当您的 Trait 文件名拼写错误或类名不正确时,有时可能会发生这种情况。请检查您的文件名是否与类名相同
如果您复制并粘贴了特征,那么它可能不起作用,您要做的就是删除特征文件夹并手动创建它,然后删除特征类并手动创建它。 (通过打字),然后确保班级的第一个字母以大写字母开头。在那里它必须起作用。
在 PHPStorm 中启用 PSR 后,我遇到了同样的问题。原因是,在我将项目目录标记为源根目录后,IDE 自动用小写字母
app
而不是 App
填充我的用途(因为目录是 app/...
)
我必须改变:
namespace app\Http\Traits;
至:
namespace App\Http\Traits;