我正在为自己做一个小项目,我开始使用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];
}
答案 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) }}