形質内に__constructor
を定義するのは実際には間違っています。または単に悪いデザイン。 Constructors should be specific to a class to which they belong、形質ではありません。もう1つの問題は、Modelクラスで特性をインポートすることです。つまり、具体的にはどのようにしてa trait in a model is loadedのルールに従わなければならないかということです。
モデルの段階では、インポートされた特性をクラス内で再帰的に検索し、自動的にboot{TraitNameHere}
命名規則を使用しているメソッドを静的に呼び出します。これは、モデルの形質がラーベルスの依存性注入サイクルに関与していないことを証明します。
Laravelグローバルヘルパーを使用して、ファサードApp::make(DefinedKeyHere)
のように、コンテナ内に格納されたインスタンスをロードできます。割り当てられたインスタンスをの静的プロパティに保存して、実行時が終了するまで、およびリコールメソッドがstatic
になるまで保持します。
trait TimezoneTrait
{
protected static $userRepository;
protected static function bootTimezoneTrait()
{
static::$userRepository = \App::make(UserRepositoryInterface::class);
}
}
現在、グローバルヘルパーの使用を避けようとしている場合は、モデル起動イベントをリッスンすることも役に立ちます。 EventServiceProvider、
Event::listen('eloquent.booting:*', function (Model $model) {
$model->setUserRepository($this->app[UserRepositoryInterface::class]);
});
内側例次に特色は、私は、静的setUserRepository
を定義していますが、あまりにも、それは非静的作ることができます注意してください、
trait TimezoneTrait
{
protected static $userRepository;
public function static setUserRepository(UserRepositoryInterface $userRepository)
{
static::$userRepository = $userRepository;
}
}
だろう。
モデルイベントについて少し詳しく説明すると、モデルには関連アクションが実行されるたびに起動するイベントがいくつかあります。 Laravel 5.5、
public function getObservableEvents()
{
return array_merge(
[
'creating', 'created', 'updating', 'updated',
'deleting', 'deleted', 'saving', 'saved',
'restoring', 'restored',
],
$this->observables
);
}
そしてbooting
とbooted
あるそのインスタンス化時に起動され、他の2つのデフォルトのイベント(またシリアライズ)から
例イベント。そして、イベントを起動するために使用するメソッドは、イベント名を確認します。 $ userRepositoryを保護
protected function fireModelEvent($event, $halt = true)
{
// ...
return ! empty($result) ? $result : static::$dispatcher->{$method}(
"eloquent.{$event}: ".static::class, $this
);
}
宣言 ';'それは私の知る限り、彼らは 'でuse'edしているクラスと一緒に注入することができない何も –
ハズレを、働くことが、何もありません。あなたが他のクラスを注入しているどのクラスでも、あなたがその形質を使用するのを止めています。 – Norgul
済みの特徴を、ない – Andrew