Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][Symfony2]Nie działa redirectResponse
Szymciosek
post
Post #1





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Szymciosek 11.05.2013, 11:45:59
Go to the top of the page
+Quote Post
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ć.

Ten post edytował Crozin 11.05.2013, 11:53:49
Go to the top of the page
+Quote Post
Szymciosek
post
Post #3





Grupa: Zarejestrowani
Postów: 1 168
Pomógł: 126
Dołączył: 5.02.2010
Skąd: Świdnica

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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().
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 30.09.2025 - 03:35