Php Symfony2如何将$year、$month变量传入到Twig而不首先进行硬编码?

Php Symfony2如何将$year、$month变量传入到Twig而不首先进行硬编码?,php,variables,symfony,twig,Php,Variables,Symfony,Twig,我试图将两个变量传入Twig,而不首先在控制器中对其进行硬编码。我正在寻找一个简单的解决方案,没有什么太过分 现在根据下面的控制器代码,它显示了我使用的每个月7月份的计数,这是我不想要的 我试图做的最终结果是在侧边栏中显示每月的帖子数量 例如,6月(3日)、7月(5日)等 在控制器中,我使用硬编码的年份和月份,并将其传递给Twig 我如何做到这一点,我不必在控制器中硬编码它/这样它就可以从细枝中获取变量(例如“年”:“2014”,“月”:“当前月”? 我尝试了这个方法,但它是一个糟糕的解决方案:

我试图将两个变量传入Twig,而不首先在控制器中对其进行硬编码。我正在寻找一个简单的解决方案,没有什么太过分

现在根据下面的控制器代码,它显示了我使用的每个月7月份的计数,这是我不想要的

我试图做的最终结果是在侧边栏中显示每月的帖子数量

例如,6月(3日)、7月(5日)等

在控制器中,我使用硬编码的年份和月份,并将其传递给Twig

我如何做到这一点,我不必在控制器中硬编码它/这样它就可以从细枝中获取变量(例如“年”:“2014”,“月”:“当前月”?

我尝试了这个方法,但它是一个糟糕的解决方案:

$month1 = $em->getRepository('AcmeDemoBundle:Post')
    ->getPostCountsByMonth('2014', 'June');

$month2 = $em->getRepository('AcmeDemoBundle:Post')
    ->getPostCountsByMonth('2014', 'July');

return $this->render('AcmeDemoBundle:Page:index.html.twig', array(
    'month1' => $month1,
    'month2' => $month2
));

控制器:

$month = $em->getRepository('AcmeDemoBundle:Post')
        ->getPostCountsByMonth('2014', 'July'); <--- what I don't want to do

return $this->render('AcmeDemoBundle:Page:index.html.twig', array(
        'month' => $month,
));
public function getPostCountsByMonth($year, $month)
{
    $date = new \DateTime("{$year}-{$month}-01");
    $toDate = clone $date;
    $toDate->modify("next month midnight -1 second");

    $query = $this->createQueryBuilder('post')
        ->where('post.created BETWEEN :start AND :end')
        ->addOrderBy('post.created', 'DESC')
        ->setParameter('start', $date)
        ->setParameter('end', $toDate);

    $query->select('COUNT(post.created)');

    $month = $query
        ->getQuery()
        ->getSingleScalarResult();

    return $month;
}
存储库:

$month = $em->getRepository('AcmeDemoBundle:Post')
        ->getPostCountsByMonth('2014', 'July'); <--- what I don't want to do

return $this->render('AcmeDemoBundle:Page:index.html.twig', array(
        'month' => $month,
));
public function getPostCountsByMonth($year, $month)
{
    $date = new \DateTime("{$year}-{$month}-01");
    $toDate = clone $date;
    $toDate->modify("next month midnight -1 second");

    $query = $this->createQueryBuilder('post')
        ->where('post.created BETWEEN :start AND :end')
        ->addOrderBy('post.created', 'DESC')
        ->setParameter('start', $date)
        ->setParameter('end', $toDate);

    $query->select('COUNT(post.created)');

    $month = $query
        ->getQuery()
        ->getSingleScalarResult();

    return $month;
}

一种方法是编写一个细枝扩展,这是一个基本示例,可能会根据您想要做的事情进行优化

namespace Acme\DemoBundle\Twig;

use Doctrine\ORM\EntityManager

class PostExtension extends \Twig_Extension
{
    private $em;

    public function __construct(EntityManager $em){
        $this->em  = $em;
    }
    public function getFilters()
    {
        return array(

        );
    }

    public function getFunctions(){
        return array(
            'getPostCount' => new \Twig_Function_Method($this,'getPostCount')
        );
    }

    public function getPostCount($year,$month)
    {
        return $this->em->getRepository('AcmeDemoBundle:Post')
            ->getPostCountsByMonth($year, '$month');
    }

    public function getName()
    {
        return 'post_extension';
    }
}
基本上你是在创建你自己的树枝过滤器。如果你之前没有这样做,请查阅文档

或者,正如我在评论中所说,您可以编写一个回购函数,按月获取所有计数,并将其传递给您的模板

不管怎样,都是注射你想要的东西

编辑从细枝过滤器更改为细枝功能

您还希望将实体管理器作为参数传递到服务中,如下所示:

your_service_name:
            class: Acme\DemoBundle\Twig\PostExtension
            tags:
                - { name: twig.extension }
            arguments:
                em: "@doctrine.orm.entity_manager"

我不明白。你想在控制器中注入年和月?我想设置它,这样我就不必在控制器中设置年/月,也不必在Twig中使用变量。我建议要么在模板中传递年,要么创建一个为你获取月的Twig扩展。然后你的Twig就可以是
{getCount('2014','july')}
好的,我已经设置好了,并且得到的函数“getPostCount”在AcmeDemoBundle中不存在:第17行的Page:index.html.twig我在twig中使用了以下命令:
{{getPostCount('2014',july')}
。从何处传递此消息?在services.yml中使用以下设置:
services:acme.twig.acme\u扩展名:class:acme\DemoBundle\twig\PostExtension标记:-{name:twig.extension}
我编辑了我的帖子,最初是作为一个细枝过滤器编写的,它可能需要是一个细枝函数。尝试新代码,确保将实体管理器传递到服务中。出现以下错误:
ErrorException:Catchable致命错误:参数1传递给Acme\DemoBundle\twig\PostExtension:\uu construct()必须是Acme\DemoBundle\Twig\EntityManager的实例,Doctrine\ORM\EntityManager的实例,在第737行的/var/www/Symfony/app/cache/dev/appdev/appDevDebugProjectContainer.php中调用,并在/var/www/Symfony/src/Acme/DemoBundle/Twig/PostExtension.php第12行
和第12行:
公共函数(EntityManager$em)中定义
如果你想使用symfony=/,你应该学习oop和php。你没有告诉php你想使用那个类和名称空间。这是假设实体管理器是你的脚本和名称空间的一部分。你必须添加
使用条令\ORM\EntityManager