@@ -347,9 +347,9 @@ and save it!
347347 class ProductController extends AbstractController
348348 {
349349 /**
350- * @Route("/product", name="product ")
350+ * @Route("/product", name="create_product ")
351351 */
352- public function index()
352+ public function createProduct(): Response
353353 {
354354 // you can fetch the EntityManager via $this->getDoctrine()
355355 // or you can add an argument to your action: index(EntityManagerInterface $entityManager)
@@ -412,6 +412,76 @@ Take a look at the previous example in more detail:
412412Whether you're creating or updating objects, the workflow is always the same: Doctrine
413413is smart enough to know if it should INSERT or UPDATE your entity.
414414
415+ Validating Objects
416+ ------------------
417+
418+ :doc: `The Symfony validator </validation >` reuses Doctrine metadata
419+ to perform some basic validation tasks::
420+
421+ // src/Controller/ProductController.php
422+ namespace App\Controller;
423+
424+ // ...
425+ use Symfony\Component\HttpFoundation\Response;
426+ use Symfony\Component\Validator\Validator\ValidatorInterface;
427+
428+ use App\Entity\Product;
429+
430+ class ProductController extends AbstractController
431+ {
432+ /**
433+ * @Route("/product", name="create_product")
434+ */
435+ public function createProduct(ValidatorInterface $validator): Response
436+ {
437+ $product = new Product();
438+ $product->setName(null); // The column in database isn't nullable
439+ $product->setPrice('1999'); // Type mismatch, an integer is expected
440+
441+ // ...
442+
443+ $errors = $validator->validate($product);
444+ if (count($errors) > 0) {
445+ return new Response((string) $errors, 400);
446+ }
447+
448+ // Will not be reached in this example
449+ $entityManager = $this->getDoctrine()->getManager();
450+ $entityManager->persist($product);
451+ $entityManager->flush();
452+
453+ return new Response('Saved new product with id '.$product->getId());
454+ }
455+ }
456+
457+ The following table summarizes the mapping between Doctrine metadata and
458+ the corresponding validation constraints:
459+
460+ +--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
461+ | Doctrine attribute | Validation constraint | Notes |
462+ +====================+===========================================================+=========================================================================+
463+ | ``nullable=true `` | :doc: `NotNull </reference/constraints/NotNull >` | Relies on :doc: `the PropertyInfo component </components/property_info >` |
464+ +--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
465+ | ``type `` | :doc: `Type </reference/constraints/Type >` | Relies on :doc: `the PropertyInfo component </components/property_info >` |
466+ +--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
467+ | ``unique=true `` | :doc: `UniqueEntity </reference/constraints/UniqueEntity >` | |
468+ +--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
469+ | ``length `` | :doc: `Length </reference/constraints/Length >` | |
470+ +--------------------+-----------------------------------------------------------+-------------------------------------------------------------------------+
471+
472+ Because :doc: `the Form component </forms >` as well as `API Platform `_
473+ internally use the Validator Component, all your forms
474+ and web APIs will also automatically benefit from these default constraints.
475+
476+ .. versionadded :: 4.3
477+
478+ The automatic validation has been added in Symfony 4.3.
479+
480+ .. tip ::
481+
482+ Don't forget to add :doc: `more precise validation constraints </reference/constraints >`
483+ to ensure that data provided by the user is correct.
484+
415485Fetching Objects from the Database
416486----------------------------------
417487
@@ -812,3 +882,4 @@ Learn more
812882.. _`ParamConverter` : http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
813883.. _`limit of 767 bytes for the index key prefix` : https://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html
814884.. _`Doctrine screencast series` : https://symfonycasts.com/screencast/symfony-doctrine
885+ .. _`API Platform` : https://api-platform.com/docs/core/validation/
0 commit comments