未找到 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.phpcomposer.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 自定义特征的主要内容,如果未能解决你的问题,请参考以下文章

未找到 Laravel 5.2 自定义包路径

使用 Laravel 5.2 的 PHPUnit 未找到自定义异常

未找到 Laravel 注册索引并创建错误

laravel 自定义命令未列出

自定义 laravel sanctum 未授权响应

Laravel 5上未显示自定义错误页面