web-dev-qa-db-ja.com

Laravelカスタム特性が見つかりません

私は特性に不慣れですが、試してみようと思いました。しかし、ロードされていないようです。

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をクリアし、autoloadをダンプしました。 Laravelは名前空間が気に入らないことがあると思いますか?composer -しかし、私が何を台無しにしているのかについてのヒントを与えるためのドキュメントを見つけるのに苦労しています。

エラー:

FatalErrorException in PolicyController.php line 15: 
Trait 'App\Helpers\CheckPermsAgainstObjectTrait' not found

何かご意見は?

6
Watercayman

自動ロードファイルをダンプしましたか?

composer dump-autoload
3
huuuk

私にとっての答えは、例としてLaravelトレイトから作業しているため、トレイトファイルの先頭に間違った名前空間がありました。トレイトがApp/Traits/MyTrait.phpにある場合は、名前空間が次のとおりであることを確認してください。

namespace App\Traits;

trait MyTrait
{
    // ..
}

次に、特性を含むファイルから:

use App\Traits\MyTrait;

class MyClass
{
    use MyTrait;

    // ..
}

config/app.phpcomposer.jsonまたは自動読み込みをいじる必要はありません。

2
Zack Morris

Laravelプロジェクトを手動で更新し、いくつかの変更を見逃したに違いないため、phpunitでテストを実行しているときにエラーTrait 'Tests\CreatesApplication' not found in '.../my_project/tests/TestCase.php' on line 9が発生するという非常によく似た問題がありました。これは、一意の名前空間でトレイトまたはクラスを作成する人にも発生する可能性があります。

とにかく、元の質問に対する@Devonのコメントは、私を正しい方向に向けました。

composer.jsonファイルに必要なオートローダー構成がなかったので、 Laravel)からLaravel(この場合は5.4)のバージョンでどうあるべきかを確認しましたgithubリポジトリ

この場合、私はApp\内の名前空間(すでにcomposer.jsonにありました)から呼び出していませんでした。

composer.jsonに欠けていたものは次のとおりです。

{
    ...,
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    ...
}

ありがとう デボン !これが他の誰かが髪を抜くのを防ぐことを願っています。

1
Quisk