2016-04-13 10 views
1

私はいくつかのエンティティを持っていて、保存したり、有効にしたり、削除したりする必要があります。なぜテーブルメソッドを呼び出さなければならないのですか?例えば:私はのようにそれを行うことができ、私の記事のエンティティのCakephp 3:エンティティからテーブル関数を呼び出すのは悪いのか良い考えですか?

$article->save(); 

または$article->delete();

それは実現するのは非常に簡単です:

$articlesTable = TableRegistry::get('Articles'); 
$article = $articlesTable->get(12); 

$article->title = 'CakePHP is THE best PHP framework!'; 
$articlesTable->save($article); 

は、なぜこのようにされていません。

namespace App\Model\Entity; 
use Cake\ORM\Entity; 

class Article extends Entity 
{ 

    public function save() 
    { 
     $table = TableRegistry::get($this->source()); 
     $table->save($this); 
    } 

} 

それは働いていますが、私はそれが悪い練習かよいアイデアかどうかを知りたいと思います。事前に

感謝:)

答えて

4

TL; DR:技術的には、あなたは(悪い習慣と考えられている)密結合の高価格のためにそれを行うことができます。

説明:エンティティがダムデータオブジェクトであるため、このベストプラクティスは考慮しません。ビジネスロジックを含むべきではありません。通常は単純なセーブコールではありませんが、実装するためのフォローアップロジックがあります:セーブの成功と失敗を処理し、それに応じてUIを更新するか、レスポンスを送信します。また、エンティティを特定のテーブルと効果的に結合します。ダムデータオブジェクトをビジネスロジックを実装するオブジェクトに変換します。

技術的には、このようにすることができますし、このようにするフレームワークやORMがあると思いますが、私は結合物のファンではありません。私は可能な限り結合されたコードを書くようにしたい。 See also SoC

また、私はあなたのアプローチでコードの行を保存するとは思わない、あなたは別の場所に移動するだけです。エンティティをビジネスロジックに結合することの導入を正当化する利点はありません。

あなたの道を行くなら、そのメソッドを特性として実装するか、ベースエンティティクラスを継承してコードを繰り返さないようにします。

+0

私はこのアプローチについてもっと知りたいと思います。以前はCakePHPのテーブルとエンティティのクラスについては考えていませんでしたが、私は公式のドキュメントからこの意図を把握していませんでした。あなたが読んでお勧めするこのトピックに関する深い議論はありますか? 私は、セットと個人の区別の点で考えてきました。したがって、エンティティのセットを扱うメソッドは、Tableクラスになり、単一のエンティティのみを扱うメソッドはEntityクラスになります。しかし、私は、これがいくつかの些細なコード構成以外の多くを実際に達成するわけではないことを知っています。 – Ethan

+0

エンティティセッターへの呼び出し**はテーブルオブジェクトに委譲していません。また、ゲッターも行いません。エンティティは単純なダムデータオブジェクトです。それらは、RDBMS内の単一の行または文書ベースのストレージ内の文書を表します。ポイントはコード編成だけでなく、*分離*です。目標はモジュール性であり、このメンテナンスと再利用が容易です。 10本のレンガから新しいものを作ることができます。接着したり、釘付けしたりすることができない場合、後で壊れにくくなります。同じことがソフトウェアに適用されます。推奨読書:https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882 – burzum

+1

私は抽象的に懸念の原理の分離を理解しており、それが他の多くの状況にどのように適用されるかを見ることができます。エンティティとテーブルを適用するのは苦労していました。私は今それを得ていると思う。エンティティは、v2が使用していた偶数の「ダム」配列の代わりに使用されるため、それらの役割は非常に限られていました。エンティティはテーブルから来る必要はなく、何もそれが永遠に永続化される必要はありません。これは 'id'を持つことはできませんし、' beforeSave() 'などの間にTableクラスによって適用されるデフォルト値を受け取ることはありません。 – Ethan

関連する問題