diff --git a/book/validation.rst b/book/validation.rst index 307420b2f8e..f0a54ab9b59 100644 --- a/book/validation.rst +++ b/book/validation.rst @@ -839,8 +839,8 @@ Group Sequence -------------- In some cases, you want to validate your groups by steps. To do this, you can -use the ``GroupSequence`` feature. In this case, an object defines a group sequence -, which determines the order groups should be validated. +use the ``GroupSequence`` feature. In this case, an object defines a group +sequence, which determines the order groups should be validated. For example, suppose you have a ``User`` class and want to validate that the username and the password are different only if all other validation passes @@ -1082,10 +1082,7 @@ Now, change the ``User`` class to implement :class:`Symfony\\Component\\Validator\\GroupSequenceProviderInterface` and add the :method:`Symfony\\Component\\Validator\\GroupSequenceProviderInterface::getGroupSequence`, -which should return an array of groups to use. Also, add the -``@Assert\GroupSequenceProvider`` annotation to the class (or ``group_sequence_provider: true`` to the YAML). If you imagine -that a method called ``isPremium`` returns true if the user is a premium member, -then your code might look like this:: +which should return an array of groups to use:: // src/Acme/DemoBundle/Entity/User.php namespace Acme\DemoBundle\Entity; @@ -1093,10 +1090,6 @@ then your code might look like this:: // ... use Symfony\Component\Validator\GroupSequenceProviderInterface; - /** - * @Assert\GroupSequenceProvider - * ... - */ class User implements GroupSequenceProviderInterface { // ... @@ -1113,6 +1106,66 @@ then your code might look like this:: } } +At last, you have to notify the Validator component that your ``User`` class +provides a sequence of groups to be validated: + +.. configuration-block:: + + .. code-block:: yaml + + # src/Acme/DemoBundle/Resources/config/validation.yml + Acme\DemoBundle\Entity\User: + group_sequence_provider: ~ + + .. code-block:: php-annotations + + // src/Acme/DemoBundle/Entity/User.php + namespace Acme\DemoBundle\Entity; + + // ... + + /** + * @Assert\GroupSequenceProvider + */ + class User implements GroupSequenceProviderInterface + { + // ... + } + + .. code-block:: xml + + + + + + + + + + + .. code-block:: php + + // src/Acme/DemoBundle/Entity/User.php + namespace Acme\DemoBundle\Entity; + + // ... + use Symfony\Component\Validator\Mapping\ClassMetadata; + + class User implements GroupSequenceProviderInterface + { + // ... + + public static function loadValidatorMetadata(ClassMetadata $metadata) + { + $metadata->setGroupSequenceProvider(true); + // ... + } + } + .. _book-validation-raw-values: Validating Values and Arrays diff --git a/components/console/helpers/dialoghelper.rst b/components/console/helpers/dialoghelper.rst index 3abf50b4a47..6917d807235 100644 --- a/components/console/helpers/dialoghelper.rst +++ b/components/console/helpers/dialoghelper.rst @@ -130,7 +130,8 @@ This methods has 2 new arguments, the full signature is:: string|array $question, callback $validator, integer $attempts = false, - string $default = null + string $default = null, + array $autocomplete = null ) The ``$validator`` is a callback which handles the validation. It should @@ -139,8 +140,8 @@ in the console, so it is a good practice to put some useful information in it. T function should also return the value of the user's input if the validation was successful. You can set the max number of times to ask in the ``$attempts`` argument. -If you reach this max number it will use the default value, which is given -in the last argument. Using ``false`` means the amount of attempts is infinite. +If you reach this max number it will use the default value. +Using ``false`` means the amount of attempts is infinite. The user will be asked as long as they provide an invalid answer and will only be able to proceed if their input is valid. diff --git a/contributing/code/standards.rst b/contributing/code/standards.rst index aadcb34ef90..bef7fc3af51 100644 --- a/contributing/code/standards.rst +++ b/contributing/code/standards.rst @@ -101,7 +101,10 @@ Structure * Declare class properties before methods; -* Declare public methods first, then protected ones and finally private ones; +* Declare public methods first, then protected ones and finally private ones. + The exceptions to this rule are the class constructor and the ``setUp`` and + ``tearDown`` methods of PHPUnit tests, which should always be the first methods + to increase readability; * Use parentheses when instantiating classes regardless of the number of arguments the constructor has;