Symfony 2放置一个被多个控制器函数使用的类的位置

时间:2014-07-26 16:10:56

标签: php symfony

我正在为自己做一个小项目,我开始使用Symfony 2.现在一切都很好',但是我真的质疑自己在哪里放置某种“主类” 。

关键是,我将在多个页面/控制器上使用“相同类型”的数据。例如,我想在第X页上显示用户所做的“帖子”计数,但也会在第Y页显示。

我实际上想要一个函数,让我们说“getUserData($ user)”,它可以在多个控制器中使用。我不想在两个页面上使用相同的控制器,因为它们除了几个部分之外完全不同。

这是帮助者,服务还是依赖注入?或者我应该只扩展bundle的defaultcontroller?

我有这样的功能:

public function getPostsByUserTopic($value, $currentTopic)
{
    $em = $this->getDoctrine()->getManager();
    $posts = $em->getRepository('DevrantStatBundle:Coffeecorner')->findBy(
        array('user' => $value,
        'topicid' => $currentTopic),
        array('time' => 'ASC')
        );

   return $posts;
}

public function getPostsByUser($value)
{
    $em = $this->getDoctrine()->getManager();
    $posts = $em->getRepository('DevrantStatBundle:Coffeecorner')->findBy(
        array('user' => $value),
        array('time' => 'ASC')
        );

   return $posts;       
}

public function countPostsByUserTopic($value, $currentTopic)
{
    $em = $this->getDoctrine()->getManager();
    $repository = $this->getDoctrine()->getRepository('DevrantStatBundle:Coffeecorner');
    $parameters = array(
        'user' => $value, 
        'topicid' => $currentTopic,
    );
    $query = $em->createQuery(
        'SELECT COUNT( u.user ) as aantal, u.user
        FROM  DevrantStatBundle:Coffeecorner u
        WHERE u.user = :user 
        AND u.topicid = :topicid
        GROUP BY  u.user, u.topicid 
        ORDER BY  aantal DESC'
    )->setParameters($parameters);

    $count = $query->getResult();

    return $count[0];
}

2 个答案:

答案 0 :(得分:1)

绝对是一项服务。服务专门设计用于提供某些功能,这些功能需要应用于系统的不同部分。只需创建一个具有您需要的功能的类,并将其注册为服务。瞧! :)

更多相关内容: http://symfony.com/doc/current/book/service_container.html

答案 1 :(得分:0)

我不认为在Symfony2中有一个像帮助者这样的概念。

为计算用户发布的帖子,您可以在Twig-template:getPostsCount()中向用户对象添加方法(例如{{app.user.postsCount}})..或者您可以使用Twig-filter { {1}}:length。但是我不知道,教条如何处理这个问题(延迟加载?也许有人可以告诉你?)

您可以写一个Twig-Extension (a Twig-Function),它实际上是symfony中的一项服务,标有{{app.user.posts|length}}。这项服务比通过依赖注入注入所需的依赖项(例如doctrine,security_context),在services.yml,services.xml或annotations中定义。

e.g。 (ACME / FooBundle /资源/配置/ services.yml):

twig.extension

然后在模板中:

acme_foo_bundle.twig.user_posts_count: class: Acme\FooBundle\Twig\UserPostsCount arguments: [@doctrine, @security_context] tags: - { name: twig.extension }

如果不向服务注入{{ user_posts_count() }}并将用户传递给函数,您也可以更通用地执行此操作:

@security_context

然后在模板中:

acme_foo_bundle.twig.user_posts_count: class: Acme\FooBundle\Twig\UserPostsCount arguments: [@doctrine] tags: - { name: twig.extension }

您也可以将其作为Twig过滤器:

{{ user_posts_count(app.user) }}