2014-07-26 23 views
1

我目前正在为自己开发一个小项目,并且开始使用Symfony 2。现在一切都很顺利,但我确实质疑自己在哪里放置某种“主类”。Symfyon 2何处放置一个被多个控制器功能使用的类

问题是,我要在多个页面/控制器上使用“相同类型”的数据。例如,我想显示用户在页面X上创建的“帖子”数量,但也会在页面Y上显示它。

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

这是助手,服务还是依赖注入?或者我应该只扩展bundle的默认控制器?

我拥有的功能是这样的:

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]; 
} 

回答

1

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

更多的是: http://symfony.com/doc/current/book/service_container.html

+0

并没有真正意义上的我。我的函数不会启动某种被用来做事情的对象。例如,我的控制器传递一些信息,如用户,应收集的数据类型以及函数返回的数据。我不打算使用该对象来实例更新用户。 –

0

我不认为有一个像在Symfony2的助手的概念。

用于计数用户做出你能的方法添加到用户对象(例如getPostsCount())..在嫩枝模板柱:{{app.user.postsCount}},或可以使用的枝条滤波器length{{app.user.posts|length}}。但我不知道,如何学说如何处理(懒加载?..也许有人可以告诉请吗?)

你可以写一个Twig-Extension (a Twig-Function)这实际上是symfony服务,用twig.extension标记。这个服务比通过在services.yml,services.xml或annotations中定义的依赖注入来注入它需要的依赖(例如,doctrine,security_context)。

例如(ACME/FooBundle /资源/配置/ services.yml):

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 } 

然后在模板:

{{ user_posts_count(app.user) }}

你也可以做到这一点作为一个枝杈过滤器:

{{ app.user | count_posts }}

+0

感谢您的输入。我用一些例子编辑了我的第一条消息。无论如何,我想我应该使用enitiry存储库,对吧?缺点是,我不明白为什么它不生成这个,但这是另一个问题:) –

+0

是的。在查询数据库时,您应该在存储库类中进行操作。 – qwertz

相关问题