Formularz logowania. Błędna metoda GET

0

Witam,

robię formularz logowania w Symfony. Mój problem polega na tym że w formularzu przesyłam metode POST a w controllerze w dump() odbiera mi GET i nie mogę wykonać dalszych kroków. Formularz pisałem sam więc jest mizerny ale się uczę:)

 {% extends 'AdminBundle:common:login_layout.html.twig' %}
{% block body %}
<div>
<div class="login_wrapper">
    <div class="text-center">
    </div>
        <div class="animate form login_form">
            <section class="login_content">
                <form action="{{ path('admin_login') }}" method="POST" enctype="multipart/form-data">
                    <h1>Login Form</h1>
                    <div>
                        <input  type="text" id="username" name="username" class="form-control" placeholder="Username" required="" />
                    </div>
                    <div>
                        <input type="password" id="password" name="password" class="form-control" placeholder="Password" required="" />
                    </div>
                    <div>
                        <button type="submit" name="submit" class="btn btn-default submit">login</button>
                    </div>

                    <div class="clearfix"></div>
<br>
<br>
                </form>
            </section>
        </div>

    {{ message }}
    </div>

</div>

{% endblock %}
<?php


namespace AdminBundle\Controller;

use Doctrine\ORM\Mapping as ORM;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Session\Session;

class SecurityController extends CommonController
{
    /**
     * @Route("/login", name="admin_login")
     * @Method({"POST","GET"})
     */
    public function loginAction(Request $request)
    {
        dump($request->getMethod());
        die();/*tutaj pokazuje metode GET*/
        if(!empty($request->getMethod() == 'POST')){


            $firstName = $request->get('username');
            $password = $request->get('password');

            $em = $this->getDoctrine()->getManager();
            $user = $em->getRepository('DatabaseBundle\Entity\User')->findOneBy(array(
                'firstName' => $firstName,
                'password' => $password
            ));


            $session = new Session();

            /*success*/
            $session->getFlashBag()->add('success', 'Zostales zalogowany');
            /*error*/
            $session->getFlashBag()->add('error', 'Wpisz poprawne dane');

            if($user){
                $session->set($firstName, $user->getFirstName());
                $session->set($password, $user->getPassword());

                foreach($session->getFlashBag()->get('success',array()) as $message);

//                return $this->redirectToRoute('user_index');
                return $this->render('AdminBundle:security:login.html.twig', array(
                    'message' => $message
                ));
            }
            else {

                foreach($session->getFlashBag()->get('error',array()) as $message);

                return $this->render('AdminBundle:security:login.html.twig', array(
                    'message' => $message
                ));
            }
        }
        else{
            return new Response('<html><body>Błąd</body></html>');
        }
    }
} 

Proszę o pomoc
Pozdrawiam

0

Bo Die to to samo co Exit a to z kolei przerywa wykonywanie kodu.
Ten warunek jest do d**y
if(!empty($request->getMethod() == 'POST')){
sprawdzasz czy getMethod jest stringiem POST i wynik tej operacji logicznej sprawdzasz czy nie jest empty

To nie ma sensu co tu robisz jest źle

 $session->getFlashBag()->add('success', 'Zostales zalogowany');
            /*error*/
            $session->getFlashBag()->add('error', 'Wpisz poprawne dane');
 
            if($user){
                $session->set($firstName, $user->getFirstName());
                $session->set($password, $user->getPassword());
 
                foreach($session->getFlashBag()->get('success',array()) as $message);
 
//                return $this->redirectToRoute('user_index');
                return $this->render('AdminBundle:security:login.html.twig', array(
                    'message' => $message
                ));
            }
            else {
 
                foreach($session->getFlashBag()->get('error',array()) as $message);
 
                return $this->render('AdminBundle:security:login.html.twig', array(
                    'message' => $message
                ));
            }
0

Tak wiem że die konczy wykonanie kodu:)Chodziło mi o to że to co jest przed die czyli

dump($request->getMethod());

zwraca mi GET a nie jak to powinno być z formularza POST.A w warunku

if(!empty($request->getMethod() == 'POST')){

Chodziło mi o to że jeżeli przesłana metoda będzie POST-em i nie bedzie pusta to wykona sie dalsza część kodu:)Ale jestem początkującym programistą php więc wpadki się zdarzają. Jak wobec tego można to zapisać i wyjąć z formularza metodę POST.Bo teoretycznie z HTML-owego formularza powinienem właśnie dostać POST-a a nie GET-a.

A propos tego co jest niżej tego dłużego kodu to dlaczego to nie ma sensu:)? Po wpisaniu poprawnego lub złego loginu i hasla FlashBag zwraca komunikat w renderowanym pliku.To działa więc nie wiem co jest tu nie tak :(

Bardzo dziękuję za odpowiedź:)

0

Zacznę do tego że nie znam tego frameworka.
Z tego co wyczytałem to pola POST czyta się za pomocą $request->request->get('field_name') a pola GET $request->query->get('field_name')
To powinno wyglądać mniej więcej tak

 public function loginAction(Request $request)
    {
       if($request->request->get('submit') == 'submit'){
 
            $firstName = $request->request->get('username');
            $password = $request->request->get('password');
 
            $em = $this->getDoctrine()->getManager();
            $user = $em->getRepository('DatabaseBundle\Entity\User')->findOneBy(array(
                'firstName' => $firstName,
                'password' => $password
            ));
 
            $session = new Session();
 
            /*success*/
            $session->getFlashBag()->add('success', 'Zostales zalogowany');
            /*error*/
            $session->getFlashBag()->add('error', 'Wpisz poprawne dane');
 
            if($user){
                $session->set($firstName, $user->getFirstName());
                $session->set($password, $user->getPassword()); // nie wiem po co trzymać hasło w sesji ale ja z tego korzystasz to spoko?
                foreach($session->getFlashBag()->get('success',array()) as $message);
            }else{
                foreach($session->getFlashBag()->get('error',array()) as $message);
            }
            return $this->render('AdminBundle:security:login.html.twig', array(
               'message' => $message
            ));
        } else{
            return new Response('<html><body>Błąd</body></html>');
        }
    }

Nie bardzo rozumiem jaki cel ma FlashBag, bo to tablica przechowująca stringi, ale idiotycznie wygląda

foreach($session->getFlashBag()->get('success',array()) as $message);

no i kod jest mniej zrozumiały dla kogoś kto przy tym pierwszy raz siada. Nie wiem czy nie prościej było by zrobić w najczystszej normalnej postaci

 
// Co zakomentowane do usunięcia
//            /*success*/
//            $session->getFlashBag()->add('success',;
//            /*error*/
//            $session->getFlashBag()->add('error',);
 
            if($user){
                $session->set($firstName, $user->getFirstName());
//              $session->set($password, $user->getPassword());
//                foreach($session->getFlashBag()->get('success',array()) as $message);
                $message =  'Zostales zalogowany';
            }else{
                $message =  'Wpisz poprawne dane';
            }
            return $this->render('AdminBundle:security:login.html.twig', array(
               'message' => $message
            ));
1

zamiast

<button type="submit" name="submit" class="btn btn-default submit">login</button>

daj

<input type="submit" value="login">
0

@lhp to tez nie działa.Zastosowałem:

$request->setMethod('POST'); 

Ale nie wiem czy tak można zmieniać metode nagle z GET na POST.

W każdym razie żadna z metod pobierania danych nie działa.Mówię tu o:

$request->get('field_name')
$request->request->get('username')

Mój kod trochę uprościłem więc teraz ma postać taką:

HTML:

 {% extends 'AdminBundle:common:login_layout.html.twig' %}
{% block body %}
<div>
<div class="login_wrapper">
    <div class="text-center">
    </div>
        <div class="animate form login_form">
            <section class="login_content">
                <form action="{{ path('admin_login') }}" method="POST" enctype="multipart/form-data">
                    <h1>Login Form</h1>
                    <div>
                        <input  type="text" id="username" name="username" class="form-control" placeholder="Username" required="" />
                    </div>
                    <div>
                        <input type="password" id="password" name="password" class="form-control" placeholder="Password" required="" />
                    </div>
                    <div>
                        <input type="submit" value="login" class="btn btn-default submit">login</input>
                    </div>

                    <div class="clearfix"></div>
<br>
<br>
                </form>

    <div class="alert-info">
                {{ message }}
    </div>

            </section>
        </div>
    </div>

</div>

{% endblock %}

PHP:

<?php
namespace AdminBundle\Controller;



use Doctrine\ORM\Mapping as ORM;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use DatabaseBundle\Entity\User;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Component\HttpFoundation\Session\Session;

class SecurityController extends CommonController
{
    /**
     * @Route("/login", name="admin_login")
     * @Method({"POST","GET"})
     */
    public function loginAction(Request $request)
    {
        $request->setMethod('POST');//zmienia mi z GET na POST
        var_dump($request->getMethod());//pokazuje mi POST
            if ($request->getMethod() == 'POST') {

                $firstName = $request->get('username');//jak wpiszę zamiast tego poprawną wartość z bazy czyli $firstName = 'login' to działa
                $password = $request->get('password');//jak wpiszę zamiast tego poprawną wartość z bazy czyli $firstName = 'haslo' to działa

                $em = $this->getDoctrine()->getManager();
                $repository = $em->getRepository('DatabaseBundle\Entity\User');
                $user = $repository->findOneBy(array(
                    'firstName' => $firstName,
                    'password' => $password
                ));

                if ($user) {
                    return $this->render('AdminBundle:security:login.html.twig', array(
                        'message' => $user->getFirstName()//Jak działa to wyświetla się ten komunikat z imieniem
                    ));
                } else {
                    return $this->render('AdminBundle:security:login.html.twig', array(
                        'message' => 'nie pobralo danych'
                    ));
                }
            }

            return $this->render('AdminBundle:security:login.html.twig',array(
                'message' => 'zla metoda'
            ));
    }
} 

Proszę o pomoc :)

0

Jestes pewny, ze sprawdzasz dobry request? Na poczatku wysylasz pierwszy, zeby zobaczyc w ogole formularz. Ten powinien isc metoda GET, stad miales taka, a nie inna wartosc. Dopiero po uzupelnieniu formularza i wyslaniu danych powinienes dostac drugi request z danymi. Tym razem POST. Poza tym najlatwiej bedzie jak otworzysz narzedzia deweloperskie w przegladarce i sprawdzisz co dokladnie wysylasz.

PS. W formularzu nie wysylasz zadnych plikow, wiec mozesz enctype wywalic.

0

Nie wiem jakim cudem ale wychodzi cały czas GET.

Informacje gdy wypełniłem pola i nacisnąłem submit:

Request URL//localhost:8000/_wdt/924b35
Request Method:GET
Status Code:200 OK
Remote Address:127.0.0.1:8000
Response Headers
view source
Cache-Control:no-cache
Connection:close
Content-Type:text/html; charset=UTF-8
Date:Sat, 15 Oct 2016 0835 GMT
Host8000
X-Powered-By:PHP/5.6.24
Request Headers
view source
Accept:/
Accept-Encoding:gzip, deflate, sdch
Accept-Language:pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Cookie:PHPSESSID=qiac0tasod10ghrnnbictnpqj1
Host8000
Referer//localhost:8000/login
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36
X-Requested-With:XMLHttpRequest

0

Problem rozwiązany. Miałem zbędny kod który się zapętlał:

main:
            anonymous: ~
            form_login:
                login_path: admin_login
                check_path: admin_login

i wyczyściłem cache.

1 użytkowników online, w tym zalogowanych: 0, gości: 1