このコードと同等のコードを多数のコントローラー アクションで実行しています。基本的にはユーザーのユーザー名を取得し、そのユーザー名がブログ エンティティに関連付けられている場合、ユーザーはブログ エンティティを表示できます。
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.context')->getToken()->getUser();
$entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
return $this->render('MySiteBundle:Blog:index.html.twig', array(
'entities' => $entities,
コードの繰り返しを削減できるように、サービスに移行したいと考えています。コントローラーでできるだけ多くのロジックを実行したくありません。
そうは言っても、サービスのユーザーセッションと教義にアクセスする方法がわかりません。
これが私のservices.ymlです:
mysite.user.blog:
class: MySite\SiteBundle\Services\BlogUser
そして、コントローラーでそれを呼び出そうとした方法は次のとおりです。
public function testAction() {
$response = $this->get('mysite.user.blog');
return new Response($response);
}
イベントサブスクライバー/リスナータグを使用してみましたが、目的のタスクを達成していないようです。
これは、サービスに対する私の完全に恐ろしい試みです。コンストラクターを使用しないと、応答を取得できませんでした。
namespace MySite\SiteBundle\Services;
use MySite\SiteBundle\Entity\Blog;
class BlogUser {
protected $entities;
public function __construct(){
$em = $this->getDoctrine()->getManager();
$user = $this->get('security.context')->getToken()->getUser();
$this->entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
}
}
私はこれを完全に間違った方法で行っていますか?私が行方不明になっているより良い方法はありますか?
編集/回答:
私の命名規則を少し変更しました:
//services.yml
mysite.user.blog.entities:
class: Mysite\SiteBundle\Services\BlogUser
arguments: ["@doctrine.orm.entity_manager", "@security.context"]
コントローラーのアクションで:
$userEntities = $this->get('mysite.user.blog.entities');
$entities = $userEntities->getEntities();
サービス自体:
class BlogUser {
protected $entities;
public function __construct($em, $securityContext){
$user = $securityContext->getToken()->getUser();
$this->entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
}
public function getEntities(){
return $this->entities;
}
}
コントローラーで $entities 変数を取得するには 2 行必要ですが、これは同じものを何度も定義するよりもはるかに優れています。