@@ -347,9 +347,9 @@ and save it!
347
347
class ProductController extends AbstractController
348
348
{
349
349
/**
350
- * @Route("/product", name="product ")
350
+ * @Route("/product", name="create_product ")
351
351
*/
352
- public function index()
352
+ public function createProduct(): Response
353
353
{
354
354
// you can fetch the EntityManager via $this->getDoctrine()
355
355
// 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:
412
412
Whether you're creating or updating objects, the workflow is always the same: Doctrine
413
413
is smart enough to know if it should INSERT or UPDATE your entity.
414
414
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
+
415
485
Fetching Objects from the Database
416
486
----------------------------------
417
487
@@ -812,3 +882,4 @@ Learn more
812
882
.. _`ParamConverter` : http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html
813
883
.. _`limit of 767 bytes for the index key prefix` : https://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html
814
884
.. _`Doctrine screencast series` : https://symfonycasts.com/screencast/symfony-doctrine
885
+ .. _`API Platform` : https://api-platform.com/docs/core/validation/
0 commit comments