我有会话,我在用户登录时处理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);
答案 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.view,kernel.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行代码放在将在控制器构造函数上调用的方法中。