Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Symfony2]Nie działa redirectResponse
Forum PHP.pl > Forum > PHP > Frameworki
Szymciosek
Witam,
tak jak w temacie, nie działa mi redirectResponse, ale uwaga: tylko w jednej metodzie:

  1. <?php
  2.  
  3. namespace Website\CoreBundle\Controller;
  4.  
  5. use Website\CoreBundle\Controller\DefaultController;
  6. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10.  
  11. class AuthController extends DefaultController
  12. {
  13. private $usersEntity;
  14. private $username;
  15. private $password;
  16. private $rememberMe;
  17.  
  18. /**
  19.   * @Route("/panel/logowanie", name="cms_login")
  20.   * @Template("WebsiteCoreBundle:Default:login.html.twig")
  21.   */
  22. public function indexAction()
  23. {
  24. $request = Request::createFromGlobals();
  25. if ($request->getMethod() == "POST")
  26. {
  27. $dataFromLoginForm = $request->get('form');
  28.  
  29. $this->username = $dataFromLoginForm['username'];
  30. $this->password = $dataFromLoginForm['password'];
  31. $this->rememberMe = $request->get('remember-me');
  32. $this->validate();
  33. }
  34.  
  35. $loginForm = $this->createFormBuilder()
  36. ->add('username', 'text', array(
  37. 'label' => ' ',
  38. 'attr' => array(
  39. 'placeholder' => 'Nazwa użytkownika'
  40. )
  41. ))
  42. ->add('password', 'text', array(
  43. 'label' => ' ',
  44. 'attr' => array(
  45. 'placeholder' => 'Hasło'
  46. )
  47. ))
  48. ->getForm();
  49.  
  50. return array('logged' => $this->session->get('logged'), 'login_form' => $loginForm->createView());
  51. }
  52.  
  53. /**
  54.   * @Route("panel/wyloguj", name="cms_logout")
  55.   */
  56. public function logoutAction()
  57. {
  58. $this->session->set('logged', false);
  59.  
  60. return new RedirectResponse($this->generateUrl('cms_home'));
  61. }
  62.  
  63. /**
  64.   * Validates the input data from the login form
  65.   */
  66. private function validate()
  67. {
  68. $loginModel = new \Website\CoreBundle\Forms\Models\LoginModel();
  69. $loginModel->username = $this->username;
  70. $loginModel->password = $this->password;
  71. $loginModel->rememberMe = ($this->rememberMe == 'on') ? true : false;
  72.  
  73. $errors = $this->get('validator')->validate($loginModel);
  74.  
  75. if (count($errors) == 0)
  76. {
  77. $entityManager = $this->getDoctrine()->getEntityManager();
  78. $this->usersEntity = $entityManager->getRepository('WebsiteCoreBundle:CmsUsers')->findBy(array(
  79. 'username' => $this->username,
  80. 'password' => $this->password
  81. ));
  82.  
  83. if (!empty($this->usersEntity))
  84. $this->login();
  85. else
  86. echo 'Brak konta';
  87. }
  88. else
  89. {
  90. //błędne dane
  91. }
  92. }
  93.  
  94. /**
  95.   * Creates the session or cookie if the data from the login form has been validated successfuly
  96.   */
  97. private function login()
  98. {
  99. if ($this->rememberMe)
  100. {
  101. $this->session->set('logged', true);
  102. $this->session->set('username', $this->username);
  103. }
  104.  
  105. return new RedirectResponse($this->generateUrl('cms_home'));
  106. }
  107.  
  108. }



indexAction: sprawdza metodę przesyłanych danych, tworzy formularz (podejrzewam, ze w symfony można śmiało stworzyć osobną klasę do tworzenia konkretnego formularza coś na wzór wykorzystanego przeze mnie LoginModel?)
logoutAction: tutaj wszystko działa sprawnie, robi się redirect do strony głównej panelu...
validate: tutaj debuggując wychodzi na to, że też wszystko przechodzi sprawnie
login: dopiero tutaj dzieje się chyba jakaś magia... dodając w tej metodzie var_dump('asd') zostaje ono wyświetlone, gdy wyświetliłem var_dump(redirectResponse) (oczywiście stworzyłem z tego zmienną), to też zostało coś tam wyświetlone, ale samo przekierowanie już nie działa przez co mam problem, bo po wykonaniu formularza poniżej, otwiera się całość, tworzy się sesja, ale zostaje mi ten formularz logowania na środku dalej...

Kod
{% extends 'WebsiteCoreBundle:Default:base.html.twig' %}

{% block content %}
<div id="login-panel">
    <div id="login-panel-title">
        <p>CMS</p>
        <p>Logowanie</p>
    </div>
    <form action="{{ path('cms_login') }}" method="post">
        {{ form_widget(login_form) }}
        <div id="remember-me"><label for="remember-me">Zapamiętaj mnie</label><input type="checkbox" name="remember-me" checked /></div>
        <input type="submit" name="login_submit" value="Zaloguj" />
        <a href="#zapomnialem" id="forgot-password">Zapomniałem hasła</a>
    </form>
</div>
{% endblock %}




Przy okazji proszę o jakieś uwagi dotyczące klasy.
Crozin
1. Po co w ogóle tworzysz od podstaw logowanie? Symfony posiada wbudowany cały framework od obsługi uwierzytelniania i autoryzacji - skorzystaj z niego. O frameworku od obsługi formularzy już nie wspominam, bo zrobiłem to wcześniej w innym wątku.
2. Po co tworzysz nowy obiekt Request (linia #24)?
3. Nie wykonuje Ci przekierowania bo o ile metoda login() zwraca obiekt odpowiedzi o tyle metoda validate() nie robi z nim już niczego, a powinna go zwrócić.
Szymciosek
ad 1) Chodzi o to: http://symfony-docs.pl/book/security.html#index-4 ? Przy czym formularz chyba już zostaje? Czy dalej nie o to Ci chodziło?
ad 2) Jak inaczej sprawdzę czy jest metodą post przesyłany? Może w sumie to nie ma sensu, a lepiej sprawdzić czy np. jest przesyłany submit z formularza logowania.
Crozin
1. Korzystaj z oficjalnej dokumentacji - na tej polskiej nie wiadomo czy mamy do czynienia z wersją 2.0.x, 2.1.x czy 2.2.x.
2. Powinienem był od razu zaznaczyć, że formularz logowania jest obsługiwany w Symfony nieco "indywidualnie" ze względu na sposób działania komponentu Security. Jest to jeden z bardziej zagmatwanych elementów Symfony i dopóki nie zrozumiesz jego działania dopóty nie powinieneś brać się za tworzenie własnego uwierzytelniania/autoryzacji. Poczytaj wszystko co znajdziesz w dokumentacji na ten temat, przeanalizuj źródła (najlepiej debuggerem, żeby zobaczyć sobie, które elementy wykonują się w danym momencie). Możesz również poczytać sobie n/t Spring Security - Symfony właśnie sklonował ten komponent ze Springa - w sensie... dosłownie sklonował, włącznie z nazwami klas czy kluczy konfiguracyjnych :]. Na razie nie polecałbym Ci tworzyć niczego na własną rękę, wykorzystaj przykłady z dokumentacji, bądź skorzystaj z wspominanego FOSUserBundle.

Cytat
Jak inaczej sprawdzę czy jest metodą post przesyłany?
Pytałem, po co tworzysz nowy. Obiekt Request jest już dostępny w DIC-u, z poziomu kontrolera możesz się do niego odwołać poprzez $this->getRequest().
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.