この@シウホーは、第九の記事です
久しぶりの更新記事、そして結果はより多くの時間が敗北のために独自のアレンジで良い週だったと述べました。。。。
今日、私たちが紹介している
Laravel
使用して、柔軟な方法Trait
について話して、Trait
私が存在するどのような分からない始め、漠然とした印象があります:再利用。目的はハハ、いくつかのコードを書くことが少ないところ必要が呼び出すためのpublicクラス、中書き込み:常に使用の理解との再利用されたことはこれです。騒ぎ、今。
序文
あなたは、多くの場合、次のような状況が表示されることがあります
class Post extends Model
{ protected static function boot() { parent::boot(); static::saving(function ($post){ $post->creator_id = $post->creator_id ?? \auth()->id(); }); } } // 或者 class Video extends Model { protected static function boot() { parent::boot(); static::saving(function ($post){ $post->creator_id = $post->creator_id ?? \auth()->id(); }); } } // 或者直接在控制器中指定 creator_id
私たちが見ることができ、コードが明確に繰り返されるが、最終的にそれを再利用し得る方法を分離されています。
このようにして?
public function hasCreator($model) { $model->creator_id = $model->creator_id ?? \auth()->id(); } // 封装一个上述公共方法,然后在模型中调用,或者在控制器中调用。
私たちは、ハハ、これらの操作は、エレガントな、非常に良いではないではないことがわかった。上記の例から 今、私たちは見て 定義され、使用される方法:laravel
Trait
// 定义
trait HasCreator
{
public static function bootHasCreator() { static::saving(function ($model) { $model->creator_id = $model->creator_id ?? \auth()->id(); }); } } // 调用 class Post extends Model { use HasCreator; } // 可以了,哈哈,自动调用已经可以实现对 creator_id 的自动写入了,是不是很优雅,哈哈。
今書くためにどのようにステップバイステップを説明します。
始めます
公式の説明:形質は、PHPの準備に似たコードの再利用単一継承言語のためのメカニズムです。開発者は、異なる階層に自由に別のクラスの多重化方法を可能にする、単一継承言語の制約を低減するために形質。セマンティックな定義とクラスの組み合わせ、複雑さを軽減ミックスインの関連伝統的な典型的な問題や多重継承クラスを回避する方法を特色。。
-
まず、どのように定義するために知っている必要が
Trait
使用されているキーワードをtrait
代わりにclass
namespace App\Traits; trait HasCreator { }
-
(我々はシンプルで始まる)メソッドを定義します。
namespace App\Traits; trait HasCreator { public static function hasCreator() { static::saving(function ($model) { $model->creator_id = $model->creator_id ?? 1; }); } }
それはで見ることができる
Trait
の宣言setCreator
まだそこにある方法で、creator
デフォルト値を設定します -
コール
namespace App; use App\Traits\HasCreator; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use HasCreator, SoftDeletes; protected $fillable = ['title', 'user_id']; protected static function boot() { parent::boot(); self::hasCreator(); } }
私の理解で、それはにある
Trait
それを使用するためには、行くためにモデルに組み込ま方法use
、自分の宣言を呼び出すために好きなようにする場合、ビットを、と。
また、上記の例で見ることができる のは、単にそのソースコードを見てみましょう:use
SoftDeletes
namespace Illuminate\Database\Eloquent; trait SoftDeletes { /** * Indicates if the model is currently force deleting. * * @var bool */ protected $forceDeleting = false; /** * Boot the soft deleting trait for a model. * * @return void */ public static function bootSoftDeletes() { static::addGlobalScope(new SoftDeletingScope); } /** * Force a hard delete on a soft deleted model. * * @return bool|null */ public function forceDelete() { $this->forceDeleting = true; return tap($this->delete(), function ($deleted) { $this->forceDeleting = false; if ($deleted) { $this->fireModelEvent('forceDeleted', false); } }); } ...... }
我々は現在、ソースコード表示から見ることができ Trait
、それはハハ、非常に予想外ではありません、プロパティの定義は、2つの方法が実際にプロパティを定義することができます。
場合は、頼むかもしれない Task
も定義する $forceDeleting
プロパティを複製するために登場したクラス>形質>親を呼び出すとき形質でクラスを呼び出す:行うにはどのような属性を実際に優先順位があり、それを支配しています、時間法では、デフォルトでは、呼び出し元のクラスベースです。
次に我々は、次の2つの方法を見て:
bootSoftDeletes
:シェーンを意味静的プレフィックスプラスブート、?それはハハ、デフォルトのアクションを表します。
それは自動呼び出しのように定義することができますので、我々は、上記ではありません HasCreator
それについての変更:
namespace App\Traits;
trait HasCreator { public static function hasCreator() // -> 改为 bootHasCreator { static::saving(function ($model) { $model->creator_id = $model->creator_id ?? 1; }); } }
その後、自動的に起動しています。
namespace App;
use App\Traits\HasCreator; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class Post extends Model { use HasCreator, SoftDeletes; protected $fillable = ['title', 'user_id']; }
だからすることができます!
この方法は、前と後ろの hasCreator
彼らの方法は、自分たちのニーズを確認するためにstaticとして宣言するかどうか、Jiuhaola呼び出すと、同じです。
ここでは、結果として生じるとのプロジェクトのいくつかをお勧めします Trait
、そこに超兄、ハハから摘み取られています。
小さなケース
HasCreator
作成者を指定します。
namespace App\Traits;
use App\User; /** * Trait HasCreator. * * @property \App\User $creator */ trait HasCreator { public static function bootHasCreator() { static::saving(function ($model) { $model->creator_id = $model->creator_id ?? \auth()->id(); }); } /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function creator() { return $this->belongsTo(User::class, 'creator_id')->withTrashed(); } /** * @param \App\User|int $user * * @return bool */ public function isCreatedBy($user) { if ($user instanceof User) { $user = $user->id; } return $this->creator_id == \intval($user); } }
Trait
3つのメソッドを定義し、今あなたにカザフスタンの簡単な説明を与えます:
- bootHasCreator:現在認証されたユーザーを与えられたデフォルト。次のよう
static::saving
あなたが記事のクラッターを見ることができる前に、理解していません。 - 作成者:相関モデルの定義
- isCreatedBy:ユーザーが着信現在の作成者であるかどうかを判断します
BelongsToUser
ユーザーを指定します。
namespace App\Traits;
use App\User; /** * Trait BelongsToUser. * * @property \App\User $user */ trait BelongsToUser { public static function bootBelongsToUser() { static::creating(function ($model) { if (!$model->user_id) { $model->user_id = \auth()->id(); } }); } /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function user() { return $this->belongsTo(User::class)->withTrashed(); } /** * @param \App\User|int $user * * @return bool */ public function isOwnedBy($user) { if ($user instanceof User) { $user = $user->id; } return $this->user_id == \intval($user); } }
私たちは理解して見、それを説明すると、上記とほぼ同じであることはありません。
結論
をご紹介するのは簡単です Trait
では Laravel
、間違った場所を書いて、どのようにハハ、ああメッセージを残すことが歓迎されているサプリメントを使用します。
関連リンク: 「私はPHP形質理解」 (形質のより深い説明-生産スーパー兄弟、ハハ)を、 「するPHP形質の概念と使用方法を把握します」