2016-09-17 2 views
0

はのは、新しい記事が作成されているとしましょう、それはまた、ログインする必要があります:コード内2つのモデルで動作するコードをどのように整理しますか?そう、

INSERT INTO article VALUES ($name); 
INSERT INTO logs VALUES ($name, GET_LAST_ID()); 

:コントローラで

class Article 
{ 
    public function add($name) 
    { 
     Sql::exec('INSERT INTO article VALUES ('.$name.')'); 
    } 
} 

class Log 
{ 
    public function add($name) 
    { 
     Sql::exec('INSERT INTO logs VALUES ('.$name.', GET_LAST_ID()); 
    } 
} 

:もちろん

$article->add('s'); 
$log->add('s'); 

( SQLハイジャックとは別に)悪いですが、いつでも繰り返すことができるので、COPY + PASTEはそれになります。どのように新しいクラスに編成しますか? AddArticleAndLogItである必要がありますか?確かにそうではありません。

+1

:としてあなたがこれを使用する

class DataPersister { public function create($table, array $data) { // This of course is a very bad implementation, I would // use placeholders, but it follows the example code you posted. Sql::exec(sprintf( 'INSERT INTO %s (%s) VALUES (%s)', $table, implode(', ', array_keys($data)), '"' . implode('", "', $data) . '"' )); $this->log($data); } public function log(array $data) { Sql::exec('INSERT INTO logs VALUES (' . $data['name'] . ', GET_LAST_ID()); } } 

。追加される現在の記事と同じ値をログテーブルに追加するトリガーを作成します。データベースのビジネスロジックに反対する人もいますが、これはあなたのケースに合っていると思います。 – Phiter

+2

「ログ」はここでのみ使用されていますか、それともサービスですか?私は値の配列を取って、どこかに記録する「ロギング」サービスを持っているのではないでしょうか?あなたが望むなら、どこでロガーを呼ぶかはあなたが決めます。 –

+0

@PhiterFernandes、いいえ、申し訳ありませんが、私は "オブザーバー"パターンを嫌いです。これはにおいと予測不可能なコードのコアです –

答えて

1

私はこれらの2つのDAL(私はそれらをモデルと呼ぶことはありません)オブジェクト用のインターフェイスを作成します。 1つの実装の変種がこのSql :: ...というものになります。次に、IArticleOperationsサービスを作成し、注入されたIArticleとILogの実装をメソッドaddで受信します。次に、メソッドaddがDALオブジェクトからこれら2つのメソッドを呼び出す実装を作成します。

ご質問が少し異なる可能性があります。新しいビジネスモデル(この記事だけでなく)を追加するたびにログを記録したいのでしょうか?

1

あなたの設定(たとえば、オブザーバー/トリガーが嫌い)や一般的なコードによっては、この質問に正解があるのはかなり難しいと思います。データ・インサータサービスはあまりにも良い選択となる、のようなもの:ログのこのモデルは、プロシージャまたはトリガを使用することによって行うことができる

$articleData = [ 'name' => 's' ]; 
$persister->create('articles', $articleData); 

$commentData = [ ... ]; 
$persister->create('comments', $commentData); 
関連する問題