0

我的一个类目前扩展了 FOSUserBundle 上的 BaseController,并返回父操作。但是,由于项目规范,我不需要编辑父类。有没有办法通过子响应发送额外的变量,让树枝渲染?

儿童班:

class ChangePasswordController extends BaseController
{
    public function changePasswordAction(Request $request)
    {
        $response = parent::changePasswordAction($request);

        return $response; // and 'myVariable' => $myVariable
    }
}

家长班:

class ChangePasswordController extends ContainerAware
{
    /**
     * Change user password
     */
    public function changePasswordAction(Request $request)
    {
        //lots of code.....

        return $this->container->get('templating')
                    ->renderResponse(
                    'FOSUserBundle:ChangePassword:changePassword.html.'
                        .$this->container->getParameter('fos_user.template.engine'),
                         array(
                         'form' => $form->createView()

                          //and 'myVariable' => $myVariable     

                          )
               );

    }
}

总而言之,有没有一种方法可以在不更改父类的情况下将某些内容传递给父类……同时使用附加变量渲染树枝视图。

- 更新 -

本质上,我想使用 FOSUserBundle changePassword 操作呈现一个表单,因此它可以正常工作:

return $this->container
            ->get('templating')
            ->renderResponse(
            'FOSUserBundle:ChangePassword:changePassword.html.'.$this->container->getParameter('fos_user.template.engine'),
            array('form' => $form->createView())
        );

但是,我想将更多变量传递给视图,就像如上所示传递“表单”一样,而不更改FosUserBundle ChangePassword Controller。因此,我有一个继承该控制器的类,添加一些附加功能并返回父更改密码操作:

class ChangePassController extends ChangePasswordController
{
    public function changePasswordAction(Request $request)
    {
        // more code......

        $response = parent::changePasswordAction($request);
        return $response;
    }
}

但是,与大多数应用程序一样,我想向视图模板添加的不仅仅是表单变量。那么有没有办法在不改变父控制器/动作的情况下将附加变量传递给视图?喜欢(但不喜欢)将 'myVariable' => $myVariable 推送到父 changePasswordAction 返回语句?

4

3 回答 3

0

FOSUserBundle 文档中有一个部分准确描述了如何做到这一点,并且来自 Symfony2 的 Cookbook,How to use Bundle Inheritance to Override parts of a Bundle

总之,创建一个类来Bundle覆盖:FOSUserBundlesrc

// src/Acme/UserBundle/AcmeUserBundle.php
<?php

namespace Acme\UserBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeUserBundle extends Bundle
{
    public function getParent()
    {
        return 'FOSUserBundle';
    }
}

然后,覆盖ChangePasswordController类:

use FOS\UserBundle\Controller\ChangePasswordController as BaseController;

class ChangePasswordController extends BaseController
{
    public function changePasswordAction(Request $request)
    {
        $response = parent::changePasswordAction($request);

        return $response; // and 'myVariable' => $myVariable
    }
}

- 更新 -

好的,我想我误读了你的问题。无论如何renderResponse(),该templating服务的作用本质上是:

$response->setContent($this->render($view, $parameters));

您可以Class通过templating运行app/console container:debug实际上是TwigEngine class.

所以你可以重新调用renderResponse()并提供你自己的额外参数。例如:

return $this->container->get('templating')->renderResponse(
    'FOSUserBundle:ChangePassword:changePassword.html.'.$this->container->getParameter('fos_user.template.engine'),
    array(
        'form' => $form->createView(),
        'myVariable' => $myVariable', // There you go
    ),
    $response // The previous response that has been rendered by the parent class, by this is not necessary
);
于 2013-08-16T09:06:51.210 回答
0

自下而上思考。

您可以使用 Twig Extension http://symfony.com/doc/current/cookbook/templating/twig_extension.html在不通过操作的情况下访问您的数据

    twig.extension.user_profile:
    class: 'MyBundle\UserProfileExtension'
    arguments:
        - '@doctrine.orm.entity_manager'
    tags:
        - { name: twig.extension }

扩展类

class UserProfileExtension extends \Twig_Extension
{
/**
 * @var EntityManager
 */
private $entityManager;

/**
 * @param UserProfileDataService $userProfileDataService
 */
public function __construct(EntityManager $entityManager)
{
    $this->entityManager = $entityManager;
}

/**
 * @return array
 */
public function getFunctions()
{
    return array(
        new \Twig_SimpleFunction('get_my_custom_var', array($this, 'getMyCustomVar')),
    );
}

/**
 * @return array
 */
public function getMyCustomVar()
{
    $var = $this->entityManager->getRepository('MyCustomRepository')->findOneBy(['id' => 1]);

    return $var;
}

/**
 * Returns the name of the extension.
 *
 * @return string The extension name
 */
public function getName()
{
    return 'user_profile_extension';
}

模板使用

{dump(get_my_custom_var())}
于 2016-06-24T13:35:19.557 回答
-1

如果我正确理解您的问题,您应该能够在响应中设置其他变量,如下所示:

use FOS\UserBundle\Controller\ChangePasswordController as BaseController;

class ChangePasswordController extends BaseController
{
    public function changePasswordAction(Request $request)
    {
        $response = parent::changePasswordAction($request);

        $response['myVariable'] = $myVariable;

        return $response;
    }
}

希望这可以帮助!

于 2015-03-05T23:27:25.807 回答