在Symfony中将变量从控制器传递到另一个?

时间:2016-06-14 14:13:34

标签: php ajax symfony doctrine twig

我的控制器中有2个动作函数,我想将变量传递给其他动作函数

这是我控制器中的第一个功能

public function newUserAction(Request $request)
{ ......... 
$url = $this->generateUrl('userBundle_new_user_reasonCodeAjaxView',  
array('id' => $newUser->getCode(),
            'countCode' => $countCode,));
            return $this->redirect($url);

这是我控制器中的第二个功能

     public function userCodeAjaxViewAction(Request $request, $id)
{

    $em = $this->getDoctrine()->getManager();
    $pc = $em->getRepository('UserBundle:Code')->find($id);

    if($pc != null)
    {
        return $this->render('UserBundle:userCodeView.html.twig', array(
         'pc' => $pc,

        ));
    }

我的twif看起来像这样

    <div class="">
    <div class="panel panel-default step3-textarea top-arrow top-arrow">
        <div class="panel-body">
            <fieldset>
                 <div>
                    {{ pc.name|trans }}

     {{countCode}} 

                </div>
            </fieldset>

        </div>
    </div>
</div>

我收到错误Variable "countCode" does not exist in...

有什么想法我如何使用其他控制器中控制器的变量?

2 个答案:

答案 0 :(得分:0)

您正在为两个控制器使用相同的模板范围,但这是不可能的。如果您使用两个控制器来呈现两个简单的信息,为什么不简单地返回JSON并使用AJAX在更全局的模板中显示它?

另外一个纯粹的symfony解决方案是拥有一个主模板view.html.twig,你可以放在哪里

<div class="">
<div class="panel panel-default step3-textarea top-arrow top-arrow">
    <div class="panel-body">
        <fieldset>
             <div>
                {{ render(controller("AppBundle:UserController:newUserAction")) }}

                {{ render(controller("AppBundle:UserController:userCodeAjaxViewAction")) }}

            </div>
        </fieldset>

    </div>
</div>

鉴于此,您的两个控制器操作模板将很简单{{ pc.name|trans }}{{countCode}}

希望它可以帮助你!

答案 1 :(得分:0)

您无法从另一个控制器获取变量 每个请求只创建一个控制器实例。

您可以做的是创建一个可以在控制器中调用的服务 这样的事情:

class CountUserService{
    public function count(){
        return 1; // count users here
    }
}

在控制器中执行此操作:

$service = new CountUserService();
$data=['countCode' => $service->count()];
return $this->render('UserBundle:userCodeView.html.twig', $data);