2016-09-05 8 views
3

パッケージを開発していて、PSR-4構造に「Traits」ディレクトリを追加しました。これはパッケージのcomposer.jsonに反映されています。 src/ディレクトリ内Laravelパッケージの特性が見つかりません

{ 
    "name": "my-private-repo/prefs", 
    "description": "Preferences package.", 
    "type": "package", 
    "keywords": [ 
     "prefs", 
     "preferences" 
    ], 
    "require": { 
     "php": ">=5.5.9", 
     "illuminate/support": "5.2.*", 
     "laravelcollective/html": "5.2.*", 
     "anahkiasen/former": "~4" 
    }, 
    "autoload": { 
     "classmap": [ 
      "src/controllers", 
      "src/models" 
     ], 
     "psr-4": { 
      "MyPrivateRepo\\Prefs\\": "src/" 
     }, 
     "files": [ 
      "src/Prefs/helpers.php" 
     ] 
    }, 
    "minimum-stability": "dev", 
    "prefer-stable": true 
} 

は、この構造である:ここでは

Prefs/ 
    Traits/ 
     HasPrefs.php 
    Prefs.php 
    PrefsServiceProvider.php 
    helpers.php 

HasPrefs.phpの内容は次のとおりです。

namespace MyPrivateRepo\Prefs\Traits; 

use MyPrivateRepo\Prefs\Prefs; 

trait HasPrefs 
{ 
    public function prefs($key = null, $value = null) 
    { 
     //...do pref related stuff here... 
    } 
} 

私は民間のプロジェクトをロードした、すべてが時に素晴らしい仕事をしていましたPrefsクラスを直接呼び出します。その後、私は私のUserモデルに追加HasPrefs形質をテストすることを決めた:、今

namespace App; 

use Cartalyst\Sentinel\Users\EloquentUser; 
use Illuminate\Database\Eloquent\SoftDeletes; 
use Illuminate\Auth\Authenticatable; 
use Illuminate\Auth\Passwords\CanResetPassword; 
use Illuminate\Foundation\Auth\Access\Authorizable; 
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract; 
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; 
use MyPrivateRepo\Prefs\Traits\HasPrefs; 

class User extends EloquentUser implements 
    AuthenticatableContract, 
    AuthorizableContract, 
    CanResetPasswordContract 
{ 
    use SoftDeletes, 
     Authenticatable, 
     Authorizable, 
     HasPrefs, 
     CanResetPassword; 

    //...do lots of user related stuff here... 
} 

私が何かをしようとするたびに、私はこのエラーが与えられている:

[Symfony\Component\Debug\Exception\FatalErrorException] 
Trait 'MyPrivateRepo\Prefs\Traits\HasPrefs' not found 

私はその後、composer updateをしたのが、得ましたphp artisan optimizeを実行するスクリプトセクションに到達すると、上記と同じエラーが発生します。

HasPrefsへの参照をUserにコメントし、問題なく動作したartisan optimizeを再実行しました。

コメントを外してHasPrefsとすると、エラーなしですべて正常に動作しています。次に、プロジェクトでcomposer updateを再度実行する必要があります。次に、私はHasPrefsへの参照をコメントアウトして、手動でartisan optimizeを実行する必要があることに戻っています。

プロダクションサーバーに展開する必要があることを考えると、自動展開によってcomposer updateまたはcomposer installがトリガーされるたびに、この特性を使用するすべてのファイルを手動で編集することはできません。

ノー成功にこれを解決するには、次を試してみた:

  • 作曲自己更新
  • 作曲明らか& &作曲更新
  • -oコメントした後

    • 職人クリアキャッシュ再びHasPrefsを外してください:職人がクリアコンパイル& &職人最適化
    • rm composer.loc
    • -o & &作曲更新をk個のrm -rfベンダー/ * & &作曲

    をインストールし、それが取るすべては上記のいずれかが一時的に問題を修正した場合にすべての繰り返しそれを破るためにcomposer updateへの単一の呼び出しです。

    ここで何が間違っていますか?

  • 答えて

    5

    あなたがここに見ることができるように:

    "psr-4": { 
        "MyPrivateRepo\\Prefs\\": "src/" 
    }, 
    

    あなたはMyPrivateRepo\Prefs名前空間としてsrcディレクトリを指しています。あなたが名前のディレクトリでこの特性を利用したいときにTraitsあなたの名前空間は次のように行く必要があります:あなたは、また、この特性におけるので、あなたのuse文をPrefsを持っているので、

    MyPrivateRepo\Prefs\Prefs\Traits 
    

    意志のようになります。

    use MyPrivateRepo\Prefs\Prefs\Prefs; 
    

    私のアドバイスはために作曲家のエントリを変更することです:

    "psr-4": { 
        "MyPrivateRepo\\": "src/" 
    }, 
    
    +0

    私はちょうど '「MyPrivateRepo \\」をやってに実行する問題:「SRC /」は'マルチがあるということですこの同じプライベートレポから他のパッケージも購入できます。これらの他のすべてのパッケージには、同じ種類のPSR-4宣言があります。たとえば、「MyPrivateRepo \\ SDK \\」:「src /」という別のcomposer.jsonもあります。 – eComEvo

    +1

    2つのコンポーザーを使いたい場合は、1つの 'src'でそれらを使うべきではありません。 'MyPrivateRepo/Sdk/src/...'と 'MyPrivateRepo/Prefs/src/...'のように他のパッケージに分割して、anathorディレクトリに分割してみてください。 –

    +0

    Greateので、 'src'の中から' Prefs'ディレクターを削除することができます(それで、すべてのディレクトリは 'src'の中に直接あります)。あなたは 'PSR-4'を理解する必要があります、それはそのように動作します。 –

    関連する問題