Skip to content

REST Request Validation Example

This example shows how to validate user input in a REST controller context. Note, how easy it is to avoid the deeply nested structures you often find in validation code. User model and form are injected as dependencies.

<?php

class UserController
{
    protected $user;
    protected $form;

    public function __construct(UserModel $user, UserForm $form)
    {
        $this->user = $user;
        $this->form = $form;
    }

    // Update User
    public function putAction(int $id, Request $request): array 
    {
        // Find entity (throws exception, if not found)
        $this->user->find($id); 

        // Form initialization with current values
        $this->form->setDefinedValues($this->user->getValues()); 

        // Set input values
        $this->form->setDefinedWritableValues($request->request->all()); 

        // Validation
        $this->form->validate(); 

        if($this->form->hasErrors()) {
            throw new FormInvalidException($this->form->getFirstError());
        }

        // Update values in database
        $this->user->update($this->form->getValues()); 

        // Return updated values
        return $this->user->getValues(); 
    }

    // Return form fields incl current values for User
    public function optionsAction(int $id): array 
    {
        // Find entity (throws exception, if not found)
        $this->user->find($id); 

        // Form initialization with current values
        $this->form->setDefinedValues($this->user->getValues()); 

        // Returns form as JSON compatible array incl all values
        return $this->form->getAsArray(); 
    }
}

See also Doctrine ActiveRecord - Object-oriented CRUD for Doctrine DBAL