【问题标题】:Laravel Custom Trait Not Found未找到 Laravel 自定义特征
【发布时间】: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,谢谢。

标签: php laravel namespaces traits


【解决方案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 文件名拼写错误或与类名一样不正确时,有时可能会发生这种情况。请检查您的文件名是否与类名相同

        【讨论】:

          猜你喜欢
          • 2017-01-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-12
          • 1970-01-01
          • 1970-01-01
          • 2020-02-21
          • 2013-07-31
          相关资源
          最近更新 更多