在每个控制器功能中获取相同的数据

时间:2017-05-29 20:07:35

标签: php symfony

我有会话,我在用户登录时处理userID。

在每个控制器功能中如果用户已登录,我必须从用户下载关于用户的数据并将其发送到视图。

效果: 在每个函数中,我至少有4行相同的代码。

问题:还有其他更简单的方法吗? (没有代码溢出)

//修改

我在每个控制器中使用这样的东西:

$variables = array();
$defaultModel = new DefaultModel($em->getRepository('AppBundle:Users'), new Session());
$variables['user'] = $defaultModel->getUserHandle()->getBaseUserData();
//...
return $this->render('UbBundle:Account:Logout.html.twig', $variables);

5 个答案:

答案 0 :(得分:1)

有不同的方法可以解决这个问题。只要您不提供有关控制器功能的更多信息,例如如何创建响应或呈现我只能猜测的视图。

一个简单的解决方案是使用your own base controller

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class BaseController extends Controller
{
    // override render method
    protected function render($template, $data)
    {
        // get your user data from db
        $userData = [];

        parent::render($template, array_merge( $userData, $data );
    }
}

让你的控制器从BaseController

延伸出来
class MyController extends BaseController
{
    public function fooAction() {

        // call the render function in your BaseController which adds user data to the view params     
        return $this->render('AppBundle:Bar:bar.html.twig', array('bar' => 'Hello World!'));

    }
}

如果你不喜欢这种方法,你也可以创建自己的事件监听器/订阅者来挂钩进程,例如听取kernel.viewkernel.response事件或kernel.controller  使用before or after filters

操纵控制器进程的事件

答案 1 :(得分:0)

只需拥有一个为您提供逻辑的私有方法或服务,然后从4个位置调用它。

答案 2 :(得分:0)

您可以使用app.user变量直接从树枝模板access current authenticated user

{{ app.user.username }}

答案 3 :(得分:0)

为什么不创建一个枝条扩展,它具有执行此操作的功能?您可以在视图层中调用它,而无需重复代码并更改所有控制器。

答案 4 :(得分:-1)

您可以将这4行代码放在将在控制器构造函数上调用的方法中。