->flush() 呼び出しを Symfony2 アプリケーションのどこに配置するかを決めるのに問題があります。私たちに「インスピレーション」を与えることができるかどうか見てみましょう。
私たちのアプリケーションは非常に大きいです。現在、約 30 のバンドルがあります。2 つの別々の開発チームがあります。1 つはフロントエンド (コントローラー + 小枝) を担当し、もう 1 つはコア (データベース + サービス + モデルなど) を担当します。
フロントエンドは 1 つのプロジェクト (独自のバンドルがあり、ドクトリン モデル、ロジック、サービスはありませんが、小枝、パブリック イメージ、CSS、およびコントローラーがあります) であり、1 つのリポジトリに存在します。
Core は別のプロジェクト (サービス、モデル オブジェクトなどを提供する独自のバンドルがあり、内部に doctrine オブジェクトがあり、コントローラーも小枝もありません) であり、別のリポジトリに存在します。
このアプローチの目標は、当社の製品がさまざまなフロントエンド (Web 用のコア + フロントエンド 1、モバイル用のコア + フロントエンド 2、通常のユーザーを管理するための特別な Web を備えたサポートチーム用のコア + フロントエンド 3) で提供されることです。したがって、すべての「ロジック」は「コア内」にあり、いずれかのフロントエンド プロジェクトが同じサービスを使用しているため、コアの改善により、フロントエンドのすべての部分を再テストすることなく、すべてのデプロイが改善されます。
だから...私たちはコントローラがドクトリンオブジェクトに決してアクセスしないようにしようとしていますが、「モデリングレイヤー」にアクセスするようにしています。フロントエンドではなく、コアのみを再テストする必要があります。
DBへのすべてのアクセスが「カプセル化」されるようにモデルを作成しようとしているため、コントローラーは教義にアクセスするのではなく、教義を使用する「サービス」にアクセスします。オブジェクト「cars」と「people」を扱うと仮定すると、コントローラーは「cars_manager」サービスまたは「people_manager」サービスにアクセスして、必要なすべての操作 (オブジェクトの作成、取得など) を実行できます。
フラッシュコールをどこに置きますか?
例(読みやすくするために疑似コードで):
controller AjaxJsonAddDriverToCar( $CarId, $DriverId )
{
try
{
$Cars = getService( "core.cars_manager" );
$Car = $Cars->getCarById( $CarId );
$Car->addDriver( $DriverId );
$Result = JSON_OK;
}
catch
{
$Result = JSON_FAIL;
}
return $Result;
}
コントローラーがコアがどのように実装されているかを認識していない場合、ドクトリンを取得して ->flush() を実行するべきではありません。
インスピレーションは大歓迎です。ありがとう。