8000 [Validator][Doctrine] Add docs for automatic validation by dunglas · Pull Request #11132 · symfony/symfony-docs · GitHub
[go: up one dir, main page]

Skip to content

[Validator][Doctrine] Add docs for automatic validation #11132

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 5 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 73 additions & 2 deletions doctrine.rst
Original file line number Diff line number Diff line change
Expand Up @@ -347,9 +347,9 @@ and save it!
class ProductController extends AbstractController
{
< 8000 /td> /**
* @Route("/product", name="product")
* @Route("/product", name="create_product")
*/
public function index()
public function createProduct(): Response
{
// you can fetch the EntityManager via $this->getDoctrine()
// or you can add an argument to your action: index(EntityManagerInterface $entityManager)
Expand Down Expand Up @@ -412,6 +412,76 @@ Take a look at the previous example in more detail:
Whether you're creating or updating objects, the workflow is always the same: Doctrine
is smart enough to know if it should INSERT or UPDATE your entity.

Validating Objects
------------------

:doc:`The Symfony validator </validation>` reuses Doctrine metadata
to perform some basic validation tasks::

// src/Controller/ProductController.php
namespace App\Controller;

// ...
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Validator\Validator\ValidatorInterface;

use App\Entity\Product;

class ProductController extends AbstractController
{
/**
* @Route("/product", name="create_product")
*/
public function createProduct(ValidatorInterface $validator): Response
{
$product = new Product();
$product->setName(null); // The column in database isn't nullable
$product->setPrice('1999'); // Type mismatch, an integer is expected

// ...

$errors = $validator->validate($product);
if (count($errors) > 0) {
return new Response((string) $errors, 400);
}

// Will not be reached in this example
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($product);
$entityManager->flush();

return new Response('Saved new product with id '.$product->getId());
}
}

The following table summarizes the mapping between Doctrine metadata and
the corresponding validation constraints:

+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
| Doctrine attribute | Validation constraint | Notes |
+====================+===========================================================+=========================================================================+
| ``nullable=true`` | :doc:`NotNull </reference/constraints/NotNull>` | Relies on :doc:`the PropertyInfo component </components/property_info>` |
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
| ``type`` | :doc:`Type </reference/constraints/Type>` | Relies on :doc:`the PropertyInfo component </components/property_info>` |
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
| ``unique=true`` | :doc:`UniqueEntity </reference/constraints/UniqueEntity>` | |
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
| ``length`` | :doc:`Length </reference/constraints/Length>` | |
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+

Because :doc:`the Form component </forms>` as well as `API Platform`_
internally use the Validator Component, all your forms
and web APIs will also automatically benefit from these default constraints.

.. versionadded:: 4.3

The automatic validation has been added in Symfony 4.3.

.. tip::

Don't forget to add :doc:`more precise validation constraints </reference/constraints>`
to ensure that data provided by the user is correct.

Fetching Objects from the Database
----------------------------------

Expand Down Expand Up @@ -812,3 +882,4 @@ Learn more
.. _`ParamConverter`: http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
.. _`limit of 767 bytes for the index key prefix`: https://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html
.. _`Doctrine screencast series`: https://symfonycasts.com/screencast/symfony-doctrine
.. _`API Platform`: https://api-platform.com/docs/core/validation/
0