8

このコードと同等のコードを多数のコントローラー アクションで実行しています。基本的にはユーザーのユーザー名を取得し、そのユーザー名がブログ エンティティに関連付けられている場合、ユーザーはブログ エンティティを表示できます。

    $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 行必要ですが、これは同じものを何度も定義するよりもはるかに優れています。

4

3 に答える 3

11

"Security.context" は Symfony 2.6 から非推奨になりました

いくつかのコミュニティでの議論の後、単純な Token/User オブジェクトを取得するには SecurityContext の依存関係が多すぎると判断されました。そのため、Symfony 2.6 以降、security.context サービスは廃止され、2 つの新しいサービス (security.authorization_checker と security.token_storage) に分割されました。

ソース

したがって、それを行う新しい方法は、最初にサービスを次のように構成することです。

mysite.user.blog:
    class: MySite\SiteBundle\Services\BlogUser
    arguments: ["@doctrine.orm.entity_manager", "@security.token_storage"]

次に、サービス クラス コンストラクターで次のようにします。

class BlogUser
{
    protected $user;
    protected $entities;

    public function __construct(EntityManager $em, TokenStorage $tokenStorage)
    {
        $this->user = $tokenStorage->getToken()->getUser();
        $this->entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
    }
}
于 2016-08-23T10:29:41.097 に答える
2

カスタムサービスに他のサービスを「注入」する方法を探しています。Service Containerのドキュメントを参照してください。

あなたの場合、コンストラクター注入を介してクラスdoctrine.orm.entity_managersecurity.contextサービスを注入できます。BlogUser例えば:

class BlogUser {

    public function __construct($em, $securityContext) {
        $user = $securityContext->getToken()->getUser();
        $this->entities = $em->getRepository('MySiteBundle:Blog')->findBy(array('user' => $user));
    }

}

そして、サービスを次のように構成します。

mysite.user.blog:
    class: MySite\SiteBundle\Services\BlogUser
    arguments:    ["@doctrine.orm.entity_manager", "@security.context"]
于 2013-08-14T06:03:51.323 に答える