Skip to content

Commit 87d48fa

Browse files
committed
minor #11132 [Validator][Doctrine] Add docs for automatic validation (dunglas)
This PR was squashed before being merged into the 4.3 branch (closes #11132). Discussion ---------- [Validator][Doctrine] Add docs for automatic validation See symfony/symfony#27735 Commits ------- d5e3496 [Validator][Doctrine] Add docs for automatic validation
2 parents 403ad61 + d5e3496 commit 87d48fa

File tree

1 file changed

+73
-2
lines changed

1 file changed

+73
-2
lines changed

doctrine.rst

Lines changed: 73 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -353,9 +353,9 @@ and save it::
353353
class ProductController extends AbstractController
354354
{
355355
/**
356-
* @Route("/product", name="product")
356+
* @Route("/product", name="create_product")
357357
*/
358-
public function index()
358+
public function createProduct(): Response
359359
{
360360
// you can fetch the EntityManager via $this->getDoctrine()
361361
// or you can add an argument to your action: index(EntityManagerInterface $entityManager)
@@ -418,6 +418,76 @@ Take a look at the previous example in more detail:
418418
Whether you're creating or updating objects, the workflow is always the same: Doctrine
419419
is smart enough to know if it should INSERT or UPDATE your entity.
420420

421+
Validating Objects
422+
------------------
423+
424+
:doc:`The Symfony validator </validation>` reuses Doctrine metadata
425+
to perform some basic validation tasks::
426+
427+
// src/Controller/ProductController.php
428+
namespace App\Controller;
429+
430+
// ...
431+
use Symfony\Component\HttpFoundation\Response;
432+
use Symfony\Component\Validator\Validator\ValidatorInterface;
433+
434+
use App\Entity\Product;
435+
436+
class ProductController extends AbstractController
437+
{
438+
/**
439+
* @Route("/product", name="create_product")
440+
*/
441+
public function createProduct(ValidatorInterface $validator): Response
442+
{
443+
$product = new Product();
444+
$product->setName(null); // The column in database isn't nullable
445+
$product->setPrice('1999'); // Type mismatch, an integer is expected
446+
447+
// ...
448+
449+
$errors = $validator->validate($product);
450+
if (count($errors) > 0) {
451+
return new Response((string) $errors, 400);
452+
}
453+
454+
// Will not be reached in this example
455+
$entityManager = $this->getDoctrine()->getManager();
456+
$entityManager->persist($product);
457+
$entityManager->flush();
458+
459+
return new Response('Saved new product with id '.$product->getId());
460+
}
461+
}
462+
463+
The following table summarizes the mapping between Doctrine metadata and
464+
the corresponding validation constraints:
465+
466+
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
467+
| Doctrine attribute | Validation constraint | Notes |
468+
+====================+===========================================================+=========================================================================+
469+
| ``nullable=true`` | :doc:`NotNull </reference/constraints/NotNull>` | Relies on :doc:`the PropertyInfo component </components/property_info>` |
470+
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
471+
| ``type`` | :doc:`Type </reference/constraints/Type>` | Relies on :doc:`the PropertyInfo component </components/property_info>` |
472+
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
473+
| ``unique=true`` | :doc:`UniqueEntity </reference/constraints/UniqueEntity>` | |
474+
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
475+
| ``length`` | :doc:`Length </reference/constraints/Length>` | |
476+
+--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
477+
478+
Because :doc:`the Form component </forms>` as well as `API Platform`_
479+
internally use the Validator Component, all your forms
480+
and web APIs will also automatically benefit from these default constraints.
481+
482+
.. versionadded:: 4.3
483+
484+
The automatic validation has been added in Symfony 4.3.
485+
486+
.. tip::
487+
488+
Don't forget to add :doc:`more precise validation constraints </reference/constraints>`
489+
to ensure that data provided by the user is correct.
490+
421491
Fetching Objects from the Database
422492
----------------------------------
423493

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

0 commit comments

Comments
 (0)