找不到Laravel Custom Trait

时间:2016-05-29 15:49:55

标签: php laravel namespaces traits

我对特质很新,但我想我试一试。但是,它似乎没有加载。

我在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

有什么想法吗?

4 个答案:

答案 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.phpcomposer.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

这对我有用