
Yii2はこれらの悪い振る舞いを取り除く時が来ました。 そして、ここに理由があります。
PHP Traitsを使用したActiveRecordのSoftDelete動作の実装例を見てみましょう。 そして、これが私たちに与えるポイントを考慮してください。
より優れたモデル制御
明らかに、レコードを「削除済み」としてマークすると、クエリの結果に取り込まれないことが期待されます。Cat :: find()-> all() 、 Cat :: find()-> one() 、など Yii1では、このような機能をCActiveRecord :: beforeFind()イベントに実装できました。 ただし、Yii2でActiveRecordを完全に処理した後、明らかな理由により、このイベントはもう存在せず、タスクは解決できないもののカテゴリに入ります。 ビヘイビアはARイベントでのみ機能します。 対照的に、特性を使用する場合、次のように、任意のモデルメソッドを自由にオーバーライドできます。
public static function find() { $query = parent::find(); // Skip deleted items if (static::$softDelete) { $query->andWhere([static::tableName() . '.' . static::$softDeleteAttribute => null]); } return $query; }
IDEの完全サポート
はい、ビヘイビアを使用すると、モデルに新しい属性を追加できますが、IDEはこれについて何も知らず、オートコンプリートについても話しません。 しかし、特性を使用する場合、IDEは仮想メソッドを含むすべての新しいメソッドとプロパティを完全に選択します。
* @property-read bool $isDeleted */ trait SoftDelete
そして今、特性SoftDeleteが接続されているすべてのARオブジェクトでisDeletedプロパティが強調表示されます。
class Cat extends ActiveRecord { use \common\traits\SoftDelete; } $cat = (new Cat)->isDeleted; // Property "isDeleted" autocompleted by IDE
マイナスワンバイク
特性の出現により、行動は実際に自転車になりました。 そして、 良心的な開発者は非常に苦しむリスクを負い、特性のこの代用品を研究するのに多くの時間を費やし、上記の問題を解決しようとします。 これはYii1では非常に優れたソリューションでしたが、今ではフレームワークを学習して使用する際にフラットな場所でオーバーヘッドになります。 彼らに別れを告げる時です。