0

そのコードを見てください

<?php

namespace Sestante\SestanteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sestante\SestanteBundle\Model\StrutturaManager;

class MainController extends Controller
{
    public function indexAction(Request $request)
    {
        return $this->render('SestanteSestanteBundle:Main:index.html.twig');
    }

    public function showLodgingsAction(Request $request)
    {
        $repo = $this->getDoctrine()->getRepository('SestanteSestanteBundle:Struttura');
        $usr = $this->get('security.context')->getToken()->getUser();
        $usrId = $usr->getId();
        $sm = new StrutturaManager($repo);
        $lodgingList = $sm->retrieveLodgingsFromUser($usrId);
        return $this->render('SestanteSestanteBundle:Main:showLodgings.html.twig',array('lodgingList' => $lodgingList));
    }
}

これは、私が書いてきたアプリケーションのコントローラーです。

をご覧くださいshowLodgingsAction。すべてのビジネスロジックをモデル ( StrutturaManager) に配置しようとしましたが、リポジトリを使用して (コントローラーから直接渡したのは、私が知る限り、ここまたは DI 経由でのみ使用できるため)、データベースにクエリを実行し、いくつか実行します精緻化して、テンプレートにレンダリングするリストを返します。

最初の質問: この「コード分離」は適切ですか、それとも私がやろうとしていることを実行するためのより良い方法が存在しますか?

2 番目の質問: 今、StrutturaManagerタイプ intoのオブジェクトを使用したいとしますindexAction。mine オブジェクトにはリポジトリが必要であることを忘れないでください。では、使用したいコントローラーのアクションごとに、すべてのオブジェクトを何度も何度も宣言する必要がありますか? よりスマートな方法が存在するに違いないと思いますが、現時点ではどちらが正しいかわかりません。

4

1 に答える 1

2

サービスとして定義StrutturaManagerし、それに注入します。こうすることで、マネージャーは必要なリポジトリにアクセスでき、コントローラーは Doctrine やリポジトリについて知ることができなくなります — これは良い方法です。EntityManager

于 2012-09-18T14:42:15.437 に答える