私はLaravelには比較的新しいので、私は自分のプロジェクトで 'Ownable' Eloquentオブジェクトを扱うミドルウェアとポリシーを作成しました。基底クラスでのLaravel依存性注入
私はこの特性を利用していた:
class CheckRights
{
public function __construct(Route $route, Ownable $object) {
$this->route = $route;
$this->object = $object;
}
public function handle($request, Closure $next)
{
// @TODO handle request
}
}
:私のコントローラで正しいアクションに割り当てられ
class RightPolicy
{
use HandlesAuthorization;
public function update(User $user, Ownable $ownable)
{
return $ownable->created_by == $user->id;
}
}
そして、私のミドルウェア、:私は単にこれを行う私のポリシーで
trait Ownable
{
public function user(){
return $this->belongsTo(User::class, 'created_by');
}
}
を
次に、Ownable特性を使用してクラスを作成しました。
Target [App\Ownable] is not instantiable while building App\Http\Middleware\CheckRights
多分使用して(依存性注入器は、右のクラスをインスタンス化するために知っているようにする方法があります:私はこのような構造を持つプロジェクトを実行しようとすると
class Thread extends Model
{
use Ownable;
}
しかし、Laravelの依存関係のインジェクターは、エラーがtrhowsルートまたは何か他のもの)?
もしそうでなければ、正しいクラスがインスタンス化されていることを確かめるために、依存性インジェクタなしで何か他のことを行う便利な方法はありますか?
特性は定義上インスタンス化できません。私はあなたがここで特徴があるとは思わない、それはクラスと拡張の詳細です –
私はそれを理解しています、私はここで多形性のために形質を使用しています。スレッドはOwnableですが、Commentableですが、ForumRuleはOwnableではありませんが、Commentable(たとえば)です。だから私はこのタイプの構造を選んだのです。 @VincentDecaux – Joas
特性を使用した結果は、常に独自の有効なクラスとして書き出すことができます。 Laravelがその特性で自動解像度を適用すると、動作しないinitを試みます。ですから、あなたが望むポイントに移動する場合は、ここで特性を使用する代わりに、あなたの方法はクラスに切り替えることです。 –