Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions doctrine.rst
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,72 @@ 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>` reuse 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="product")
*/
public function index(ValidatorInterface $validator)
{
$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 summaries 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.

.. 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 +878,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/