从Symfony2中的嵌入式控制器重定向

时间:2012-01-23 11:25:59

标签: php symfony

我有两个控制器,比如 loginAction() registerAction 嵌入到索引页面( index.html.twig )中,如下所示:

// index.html.twig
{% block header %}
{% if app.session.get('loggedin') is null%}
<div class="linear_form_holder">
    {% render "AppBaseBundle:Core:login" %}
</div>
{% endif %}
{% endblock %}

现在,在登录控制器中,我正在使用它:

public function loginAction(Request $request) {
    if ($password == $record->getPassword()) {
    /* then set the session variables */
        $session->set('loggedin', '1');
        $session->set('username',$record->getUsername());
        $session->set('userid',$record->getId());
    /* and grant access to the profile */
        return $this->redirect($this->generateUrl('home'),301);
    }
    else 
        return $this->redirect($this->generateUrl('main_page'),301);
}

但是,我收到了这个错误:

在呈现模板期间抛出异常(“呈现时出错”http://localhost/web/app_dev.php/“(状态代码为301)。”)在AppBaseBundle:Core中: index.html.twig第6行。

如何在嵌入式控制器中进行重定向?

2 个答案:

答案 0 :(得分:3)

自从我提出这个问题以来已经有很长一段时间了,从评论中可以看出,或者如果你只是阅读代码,那么设计就是非常有缺陷的。我刚刚开始使用Symfony2和MVC架构,所以很久以后我意识到为什么我永远不会得到这个问题的答案:P

从那以后,我转向了许多不同的框架,完全抛弃了Symfony的错综复杂的方式来接受节点,主干,角度等等,生活变得更加简单。

无论如何,因为这个问题似乎仍然是从Symfony开始收集一些观点和偏离投票(我猜),这里是固定代码和一些推理(我从我的GIT回购中提取了这个,这个很久以前,即切齿阶段,所以我不太确定这是不是一个好方法,但无论如何)

在您的控制器中

public function indexAction() {
  $session = $this->getRequest()->getSession();    
  if($session->get('loggedin') != null ) {
    return $this->redirect($this->generateUrl('home'),301);
  } else {
    $loginData = array();
    $loginForm = $this->createFormBuilder($loginData)
        ->add('email', 'email')
        ->add('password', 'password')
        ->getform();
    return $this->render('AppBundle:Core:index.html.twig',
               array('loginForm' => $loginForm->createView()) );
  }
}

在您的视图中

{% extends '::basetemplate.html.twig' %}
{% block title %}PAGE TITLE{% endblock %}

  {% block header %}
  {% if app.session.get('loggedin') is null %}
  <div class="linear_form_holder">
    {% include "AppBundle:Core:login.html.twig" with {'form':loginForm} %}
  </div>
  {% endif %}
{% endblock %}

要带走的东西:

  1. 不要像loginAction这样的递归调用重定向到main-page,再次调用loginAction,就像在我的问题中一样:不仅我的问题中的代码存在缺陷,而且递归过多无论如何会杀死服务器,所以你可能无法弄清楚什么是错的。尽量保持简单。
  2. 摘要登录和注册以及其他表格,不要使用模板。将它们绑定到模型,并使用formBuilder生成表单。

    额外建议:如果可以,请切换到更新的技术,例如nodejs或Go(我还没有尝试过)。最初,学习投入很多,但随着时间的推移你会获益。请随意忽略这些额外的建议。

  3. 玩得开心

    :)

答案 1 :(得分:3)

忘记从子请求重定向。

解决方案是:  1.让您在子模板中创建的表单发布到您的父控制器。 (表单仍然可以在不同的控制器中创建,没问题)  2.在父控制器中检查您的请求以捕获来自子控制器的信息并检查您的子模板表单的信息是否进入。

例如:

$myPostInfo = $request->request->all()
if(isset($myPostInfo['acme_userbundle_login'])) {
  die('form has been submitted');
  // here you can do the stuff one would do on a committed form
}

对于登录,最好将其添加到基本模板,但是当你有AJAX调用的表单时,这就是我使用的解决方案。

祝你好运

有任何问题吗?让我发布。