【问题标题】:Redirect from embedded controller in Symfony2从 Symfony2 中的嵌入式控制器重定向
【发布时间】:2012-01-23 11:25:58
【问题描述】:

我有两个控制器,比如说 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);
}

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

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

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

【问题讨论】:

  • 您认为嵌入式控制器应该如何处理重定向?
  • 我不确定在您的树枝模板中使用“渲染”功能。这里的意图是什么?当你到达你的 twig 模板时,你应该输出 html,如果你需要重定向,你应该在 之前 你到达这个阶段。在我看来,您正试图从 within 您的树枝模板重定向 - 这是正确的吗?
  • @kissmyface :是的,我认为这是正确的......(虽然我没有那样看)
  • 或者,有没有更好的方法将登录表单嵌入到索引页面中?

标签: php symfony


【解决方案1】:

忘记从子请求重定向。

解决办法是: 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 调用的表单时,这是我使用的解决方案。

祝你好运

有什么问题吗?随时通知我。

【讨论】:

  • 感谢您的回答。我希望这对未来使用 Symfony2 的窥视者有用。不幸的是(或幸运的是),几年前我把 symfony 扔到了窗外,因为它是一个非常慢的地方,无法进行任何认真的开发。
【解决方案2】:

自从我问这个问题以来已经很长时间了,从 cmets 可以看出,或者如果您只是阅读代码,那么设计存在严重缺陷。我刚开始使用 Symfony2 和一般的 MVC 架构,所以很久以后我才意识到为什么我永远不会收到这个问题的答案:P

从那时起,我转向了许多不同的框架,并完全抛弃了 Symfony 的复杂方式,转而采用 node、backbone、angularjs 等等,生活变得简单多了。

无论如何,由于这个问题似乎仍在从 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(我还没有尝试过)。最初对学习的投资很大,但随着时间的推移,你会收获它的好处。随意忽略这个额外的建议。

玩得开心

:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多