Перенаправление со встроенного контроллера в Symfony2 - PullRequest
7 голосов
/ 23 января 2012

У меня есть два контроллера, скажем 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 ]

3 голосов
/ 16 февраля 2015

Забудьте о перенаправлении из подзапроса.

Решение: 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, я использую это решение.

Удачи

Есть вопросы? Держите меня в курсе.

3 голосов
/ 05 июня 2013

Прошло довольно много времени с тех пор, как я задал этот вопрос, и, как видно из комментариев, или, если вы просто прочитали код, дизайн был ужасно ошибочным. Я только начинал с Symfony2 и архитектуры MVC в целом, поэтому гораздо позже я понял, почему никогда не получу ответ на этот вопрос: P

С тех пор я перешел ко многим различным фреймворкам и полностью отказался от запутанных способов Symfony, чтобы охватить узел, магистраль, 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 (я еще не пробовал). Изначально инвестиции в обучение очень велики, но со временем вы получите выгоду. Не стесняйтесь игнорировать этот дополнительный совет.

Веселись

:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...