2 Stimmen

Erstellen einer REST-API in Symfony2 - leere Eingabe

Ich habe diesem Leitfaden so genau wie möglich gefolgt, um eine einfache REST-API in Symfony2 zu erstellen.

Leider erhalte ich immer, egal was ich an die API poste:

{"children":{"firstName":{"errors":["Dieser Wert darf nicht leer sein."]},"lastName":{"errors":["Dieser Wert darf nicht leer sein."]},"email":{"errors":["Dieser Wert darf nicht leer sein."]},"password":{"errors":["Dieser Wert darf nicht leer sein."]},"dob":{"errors":["Dieser Wert darf nicht leer sein."],"children":{"year":[],"month":[],"day":[]}},"tutorialWatched":{"errors":["Dieser Wert darf nicht leer sein."]},"challengeEmails":{"errors":["Dieser Wert darf nicht leer sein."]},"mailingList":{"errors":["Dieser Wert darf nicht leer sein."]}}}

Meine Validierung sieht wie folgt aus:

LifeMirror\APIBundle\Model\Users:
    properties:
        firstName:
            - NotBlank:
        lastName:
            - NotBlank:
        email:
            - NotBlank:
            - Email:
        password:
            - NotBlank:
        dob:
            - NotBlank:
            - Date:
        tutorialWatched:
            - NotBlank:
            - Choice:
                choices: [0, 1]
        challengeEmails:
            - NotBlank:
            - Choice:
                choices: [0, 1]
        mailingList:
            - NotBlank:
            - Choice:
                choices: [0, 1]

Und mein Controller ist:

class RegisterController extends Controller
{
    public function indexAction()
    {
        return $this->processForm(new Users());
    }

    private function processForm(Users $user)
    {
        $statusCode = $user->isNew() ? 201 : 204;

        $form = $this->createForm(new UsersType(), $user);
        $form->bind($this->getRequest());

        if ($form->isValid()) {
            $user->save();

            $response = new Response();
            $response->setStatusCode($statusCode);
            return $response;
        }
        $view = View::create($form, 400);
        $view->setFormat('json');
        return $view;
    }
}

Ich kann $this->getRequest() mit var_dump ausgeben und sehe, dass die Daten vorhanden sind, aber ich bin mir nicht sicher, warum der Validator sich beschwert.

EDIT:

Hier ist das Formular:

namespace LifeMirror\APIBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class UsersType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('firstName');
        $builder->add('lastName');
        $builder->add('email');
        $builder->add('password');
        $builder->add('dob');
        $builder->add('tutorialWatched');
        $builder->add('challengeEmails');
        $builder->add('mailingList');
    }

    /**
     * {@inheritdoc}
     */
    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class' => 'LifeMirror\APIBundle\Model\Users',
            'csrf_protection'   => false,
        );
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'users';
    }
}

Und meine Eingabe: enter image description here

EDIT 2: Inhalt von $_REQUEST:

array(9) { ["firstName"]=> string(5) "James" ["lastName"]=> string(6) "Hadley" ["email"]=> string(9) "fd@fd.com" ["password"]=> string(7) "test123" ["dob"]=> string(33) "{'year':1991,'month':08,'day':02}" ["location"]=> string(9) "Lancaster" ["tutorialWatched"]=> string(1) "0" ["challengeEmails"]=> string(1) "0" ["mailingList"]=> string(1) "0" }

EDIT 3: HTML-Formular:

1voto

P. R. Ribeiro Punkte 2979

Das Problem ist, dass du den Formnamen nicht in deiner Aktion berücksichtigst. Übrigens ist dein Formname 'users'.

Ändere deine Aktion zu

class RegisterController extends Controller
{
    public function indexAction()
    {
        return $this->processForm(new Users());
    }

    private function processForm(Users $user)
    {
        $statusCode = $user->isNew() ? 201 : 204;

        $form = $this->createForm(new UsersType(), $user);
        $form->bind(array('users'=>$this->getRequest()->query->all()));

        if ($form->isValid()) {
            $user->save();

            $response = new Response();
            $response->setStatusCode($statusCode);
            return $response;
        }
        $view = View::create($form, 400);
        $view->setFormat('json');
        return $view;
    }
}

Jetzt sollte es funktionieren.

Die neue Bindung ist der Schlüssel, um es zum Laufen zu bringen

$form->bind(array('users'=>$this->getRequest()->query->all()));

PS: Beachte, dass wenn du Twig zur Darstellung dieses Formulars verwendest, du den Code nicht ändern musst, da der Formname zusammen mit dem HTML-Markup gerendert wird.

Dein HTML-Formular sollte ungefähr so aussehen

1voto

Emii Khaos Punkte 9951

Wenn Sie den FOSRestBundle und den Body-Listener verwenden, akzeptiert die Anfrage keinen application/x-www-form-urlencoded-Inhalt mehr. Sie können keine Daten mehr über ein HTML-Formular senden.

REST-Webservice bedeutet, dass Sie Ihre Anfragedaten als JSON oder XML senden, genauso wie Sie die Antwort erhalten.

Zum Testen können Sie das NelmioApiDocBundle zu Ihrem Projekt hinzufügen, sie haben einen ausgezeichneten Sandbox zum Testen.

0voto

James Punkte 731

Merkwürdigerweise musste in meinem Fall jedes Feld manuell im Controller angegeben werden:

    $form->bind(array(
        "firstName" => $this->getRequest()->request->get('firstName'),
        "lastName" => $this->getRequest()->request->get('lastName'),

usw.

0voto

TomiS Punkte 123

Ich bin auch auf dieses Problem gestoßen. Ich konnte es zum Laufen bringen, indem ich (POST) Anforderungsvariablen wie folgt verbinde:

$form->bind($request->request->all());

Trotzdem finde ich es sehr seltsam, dass die Standardmethode nicht funktioniert...

EDIT: Ok, ich habe es herausgefunden. Es handelt sich um eine Namensraum-Sache. Wenn ich Variablen mit einem Namensraum wie myformname[fieldname] anstatt nur fieldname poste, funktioniert es mit

$form->bind($request);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X