Содержание


Быстрый старт


Quick Start, Form, ЗФ2, Zend Framework 2, ZF2, ру, ru




Использование форм является довольно простой задачей. Как минимум, для каждого элемента или группы необходимо задать имя, а так же можно задать атрибуты, которые будут использоваться при рендеринге этого элемента. Так же форма обычно создает InputFilter, используя фабрику. В отдельных элементах может быть информация, которую нужно использовать по умолчанию при необходимости в InputFilter.

 

Для валидации формы нужно просто передать массив данных в метод «setData()».  Если же Вы хотите еще упростить работу с формой, то можете связать (bind) объект и форму. Если валидация пройдет успешно, то объект будет заполнен нужными данными.

 

Программное создание формы

 

Сначала рассмотри пример:

 

use Zend\Captcha;
use Zend\Form\Element;
use Zend\Form\Fieldset;
use Zend\Form\Form;
use Zend\InputFilter\Input;
use Zend\InputFilter\InputFilter;
 
$name = new Element('name');
$name->setLabel('Your name');
$name->setAttributes(array(
    'type'  => 'text'
));
 
$email = new Element\Email('email');
$email->setLabel('Your email address');
 
$subject = new Element('subject');
$subject->setLabel('Subject');
$subject->setAttributes(array(
    'type'  => 'text'
));
 
$message = new Element\Textarea('message');
$message->setLabel('Message');
 
$captcha = new Element\Captcha('captcha');
$captcha->setCaptcha(new CaptchaDumb());
$captcha->setLabel('Please verify you are human');
 
$csrf = new Element\Csrf('security');
 
$send = new Element('send');
$send->setValue('Submit');
$send->setAttributes(array(
    'type'  => 'submit'
));
 
 
$form = new Form('contact');
$form->add($name);
$form->add($email);
$form->add($subject);
$form->add($message);
$form->add($captcha);
$form->add($csrf);
$form->add($send);
 
$nameInput = new Input('name');
// configure input... and all others
$inputFilter = new InputFilter();
// attach all inputs
 
$form->setInputFilter($inputFilter);

Для демонстрации группировки элементов (fieldset), за основу возьмем пример выше. Создадим две группы: одна для отправки информации, а другая для сообщений.

$sender = new Fieldset('sender');
$sender->add($name);
$sender->add($email);
 
$details = new Fieldset('details');
$details->add($subject);
$details->add($message);
 
$form = new Form('contact');
$form->add($sender);
$form->add($details);
$form->add($captcha);
$form->add($csrf);
$form->add($send);

Независимо от подхода, подобный способ создания форм достаточно скучен и утомителен.

 

 

Создание форм с помощью фабрики

 

Как Вы уже догадались, создать форму и inputFilter можно, используя фабрику.  Так же будет очень полезно, если необходимо сохранить форму как чистую конфигурацию. При передаче сохраненной конфигурации формы в фабрику -  форма строиться автоматически.

use Zend\Form\Factory;
 
$factory = new Factory();
$form    = $factory->createForm(array(
    'hydrator' => 'Zend\Stdlib\Hydrator\ArraySerializable',
    'elements' => array(
        array(
            'spec' => array(
                'name' => 'name',
                'options' => array(
                    'label' => 'Your name',
                ),
                'attributes' => array(
                    'type'  => 'text'
                ),
            )
        ),
        array(
            'spec' => array(
                'type' => 'Zend\Form\Element\Email',
                'name' => 'email',
                'options' => array(
                    'label' => 'Your email address',
                )
            ),
        ),
        array(
            'spec' => array(
                'name' => 'subject',
                'options' => array(
                    'label' => 'Subject',
                ),
                'attributes' => array(
                    'type'  => 'text',
                ),
            ),
        ),
        array(
            'spec' => array(
                'type' => 'Zend\Form\Element\Textarea',
                'name' => 'message',
                'options' => array(
                    'label' => 'Message',
                )
            ),
        ),
        array(
            'spec' => array(
                'type' => 'Zend\Form\Element\Captcha',
                'name' => 'captcha',
                'options' => array(
                    'label' => 'Please verify you are human.',
                    'captcha' => array(
                        'class' => 'Dumb',
                    ),
                ),
            ),
        ),
        array(
            'spec' => array(
                'type' => 'Zend\Form\Element\Csrf',
                'name' => 'security',
            ),
        ),
        array(
            'spec' => array(
                'name' => 'send',
                'attributes' => array(
                    'type'  => 'submit',
                    'value' => 'Submit',
                ),
            ),
        ),
    ),
    /* If we had fieldsets, they'd go here; fieldsets contain
     * "elements" and "fieldsets" keys, and potentially a "type"
     * key indicating the specific FieldsetInterface
     * implementation to use.
    'fieldsets' => array(
    ),
     */
 
    // Configuration to pass on to
    // ZendInputFilterFactory::createInputFilter()
    'input_filter' => array(
        /* ... */
    ),
));

А если захотите использовать группы, то это делается так:

use Zend\Form\Factory;
 
$factory = new Factory();
$form    = $factory->createForm(array(
    'hydrator'  => 'Zend\Stdlib\Hydrator\ArraySerializable'
    'fieldsets' => array(
        array(
            'name' => 'sender',
            'elements' => array(
                array(
                    'name' => 'name',
                    'options' => array(
                        'label' => 'Your name',
                        ),
                    'attributes' => array(
                        'type'  => 'text'
                    ),
                ),
                array(
                    'type' => 'Zend\Form\Element\Email',
                    'name' => 'email',
                    'options' => array(
                        'label' => 'Your email address',
                        ),
                ),
            ),
        ),
        array(
            'name' => 'details',
            'elements' => array(
                array(
                    'name' => 'subject',
                    'options' => array(
                        'label' => 'Subject',
                        ),
                    'attributes' => array(
                        'type'  => 'text',
                    ),
                ),
                array(
                    'type' => 'Zend\Form\Element\Textarea',
                    'options' => array(
                        'label' => 'Message',
                        ),
                ),
            ),
        ),
    ),
    'elements' => array(
        array(
            'type' => 'Zend\Form\Element\Captcha',
            'name' => 'captcha',
            'o/span/* ... *//spanptions' => array(
                'label' => 'Please verify you are human. ',
                'captcha' => array(
                    'class' => 'Dumb',
                ),
            ),
        ),
        array(
            'type' => 'Zend\Form\Element\Csrf',
            'name' => 'security',
        ),
        array(
            'name' => 'send',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Submit',
            ),
        ),
    ),
 
    // Configuration to pass on to
    // ZendInputFilterFactory::createInputFilter()
    'input_filter' => array(
        /* ... */
    ),
));

Важно: Основная разница заключается во вложенности!

 

Расширение формы с конца (Factory-backed Form Extension)

 

Реализация форм по умолчанию противоположна фабрике. Это позволяет расширять её, а так же определять её изнутри. Так же, основным плюсом является возможность смешивать программный и фабрический подход создания формы, а так же определять форму таким образом, что б можно было её использовать повторно в пределах Вашего приложения.

namespace Contact;
 
use Zend\Captcha\AdapterInterface as CaptchaAdapter;
use Zend\Form\Element;
use Zend\Form\Form;
 
class ContactForm extends Form
{
    protected $captcha;
 
    public function setCaptcha(CaptchaAdapter $captcha)
    {
        $this->captcha = $captcha;
    }
 
    public function prepareElements()
    {
        // add() can take either an Element/Fieldset instance,
        // or a specification, from which the appropriate object
        // will be built.
 
        $this->add(array(
            'name' => 'name',
            'options' => array(
                'label' => 'Your name',
            ),
            'attributes' => array(
                'type'  => 'text',
            ),
        ));
        $this->add(array(
            'type' => 'Zend\Form\Element\Email',
            'name' => 'email',
            'options' => array(
                'label' => 'Your email address',
            ),
        ));
        $this->add(array(
            'name' => 'subject',
            'options' => array(
                'label' => 'Subject',
            ),
            'attributes' => array(
                'type'  => 'text',
            ),
        ));
        $this->add(array(
            'type' => 'Zend\Form\Element\Textarea',
            'name' => 'message',
            'options' => array(
                'label' => 'Message',
            ),
        ));
        $this->add(array(
            'type' => 'Zend\Form\Element\Captcha',
            'name' => 'captcha',
            'options' => array(
                'label' => 'Please verify you are human.',
                'captcha' => $this->captcha,
            ),
        ));
        $this->add(new ElementCsrf('security'));
        $this->add(array(
            'name' => 'send',
            'attributes' => array(
                'type'  => 'submit',
                'value' => 'Submit',
            ),
        ));
 
        // We could also define the input filter here, or
        // lazy-create it in the getInputFilter() method.
    }
}

В этом примере используется метод «prepareElements()». Это делается для обеспечения изменений в конфигурации формы или InputFilter экземпляре фабрики, которая потом свяжет все это с элементами и создаст. В этой форме используется так же инъекция адаптера «CAPTCHA», что позволяет нам настраивать ее где нужно в приложении, а потом инъекцировать в форму.

 

Проверка (валидация) форм

 

Валидация формы проходит три этапа. 

Первый – прикрепить к форме InputFilter

Второй – инъецировать данные, для валидации их в форме

Третий – непосредственно проверка формы.

 

Если проверка не проходит -  нужно вывести соответствующее сообщение.

$form = new Contact\ContactForm();
 
// If the form doesn't define an input filter by default, inject one.
$form->setInputFilter(new Contact\ContactFilter());
 
// Get the data. In an MVC application, you might try:
$data = $request->getPost();  // for POST data
$data = $request->getQuery(); // for GET (or query string) data
 
$form->setData($data);
 
// Validate the form
if ($form->isValid()) {
    $validatedData = $form->getData();
} else {
    $messages = $form->getMessages();
}

При необходимости можно получить исходные данные, обратившись к InputFilter:

$filter = $form->getInputFilter();
 
$rawValues    = $filter->getRawValues();
$nameRawValue = $filter->getRawValue('name');

Намёки для Input Filter

 

Часто, создаются элементы, которые должны вести себя одинаково при каждом использовании, но для которых должны применяться разные фильтры и валидаторы. Однако Input Filter – это отдельный объект. И как реализовать все это?

 

И так. Реализация формы по умолчанию использует фабрику. А фабрика по умолчанию формирует фабрику Input Filter. А для нужных элементов создать «намеки» в «input filter». Если же нету «input» или «input filter» для элемента, то будут использоваться «намеки» для создания этих элементов.

 

Рассмотрим, что нужно сделать, что б реализовать все выше сказанное. Элементы должны реализовать «Zend\InputFilter\InputProviderInterface», который определяет метод «getInputSpecification()». Группировки должны реализовать «Zend\InputFilter\InputFilterProviderInterface», который определяет метод «getInputFilterSpecification()».

 

В контексте элементов, «getInputFilterSpecification()» должен возвращать данные, которые сможет использовать «input filter» для создания «input». Все HTML5 элементы (email, url, color и т.д.) используют встроенные элементы, использующие подобную логику. Рассмотрим, как создать элемент «Zend\Form\Element\Color» :

namespace Zend\Form\Element;
 
     use Zend\Form\Element;
     use Zend\InputFilter\InputProviderInterface;
     use Zend\Validator\Regex as RegexValidator;
     use Zend\Validator\ValidatorInterface;
 
     /**
      * @category   Zend
      * @package    Zend_Form
      * @subpackage Element
      */
     class Color extends Element implements InputProviderInterface
     {
         /**
          * Seed attributes
          *
          * @var array
          */
         protected $attributes = array(
             'type' => 'color',
         );
 
         /**
          * @var ValidatorInterface
          */
         protected $validator;
 
         /**
          * Get validator
          *
          * @return ValidatorInterface
          */
         protected function getValidator()
         {
             if (null === $this->validator) {
                 $this->validator = new RegexValidator('/^#[0-9a-fA-F]{6}$/');
             }
             return $this->validator;
         }
 
         /**
          * Provide default input rules for this element
          *
          * Attaches an email validator.
          *
          * @return array
          */
         public function getInputSpecification()
         {
             return array(
                 'name' => $this->getName(),
                 'required' => true,
                 'filters' => array(
                     array('name' => 'Zend\Filter\StringTrim'),
                     array('name' => 'Zend\Filter\StringToLower'),
                 ),
                 'validators' => array(
                     $this->getValidator(),
                 ),
             );
         }
     }

Тут есть намек фильтру входа (input filter) создать и прикрепить имя после элемента, пометив его как «обязательное» (required), и применив фильтры «StringTrim» и «StringToLower», валидатор «Regex». Вы можете доверить применение фильтров и валидаторов «input filter», или самим создать их экземпляры. 

 

Работа с группировками почти такая же. Отличие в том, что метод «getInputFilterSpecification()» должен вернуть конфигурацию для «input filter».

namespace ContactForm;
 
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
 
class SenderFieldset extends Fieldset implements InputFilterProviderInterface
{
    public function getInputFilterSpecification()
    {
        return array(
            'name' => array(
                'required' => true,
                'filters'  => array(
                    array('name' => 'Zend\Filter\StringTrim'),
                ),
            ),
            'email' => array(
                'required' => true,
                'filters'  => array(
                    array('name' => 'Zend\Filter\StringTrim'),
                ),
                'validators' => array(
                    new Validator\Email(),
                ),
            ),
        );
    }
}

Спецификации – это хороший способ сделать формы, элементы и группировки повторно используемыми в приложении. Captcha and Csrf определяют спецификации для того, что б они могли работать даже без пользовательских настроек.

 

Привязка объекта (Binding an object)

 

Как уже было сказано, формы в Zend Framework -  это мост между моделью и выводом. Рассмотрим это на практике.

 

Когда вы используете метод «bind()», связывая объект с формой, происходит следующее:

- Гидратор вызывает метод «extract()», и если возвращаются значения, использует их для заполнения атрибутов элементов. Если в форме содержатся группы, то метод «extract()» вызывается рекурсивно, пока не обойдет все вложенности.

-  При вызове метода «isValid()», проверяется, был ли вызван метод «setData()». Если нет, то идет обращение к гидратору для извлечения значений из объекта, а затем происходит валидация.

- Если «isValid()» возвращает «TRUE», и если есть флаг «bindOnValidate», который по умолчанию установлен в «TRUE», то гидратор передает проверенные данные для гидратации (заполнения) привязанного объекта. Если Вам не нужно такое поведение системы, воспользуйтесь методом «setBindOnValidate».

- Если объект реализует «Zend\InputFilter\InputFilterAwareInterface», то «input filter» будет использоваться а не интерфейс.

$contact = new ArrayObject;
$contact['subject'] = '[Contact Form] ';
$contact['message'] = 'Type your message here';
 
$form    = new Contact\ContactForm;
 
$form->bind($contact); // form now has default values for
                       // 'subject' and 'message'
 
$data = array(
    'name'    => 'John Doe',
    'email'   => 'j.doe@example.tld',
    'subject' => '[Contact Form] \'sup?',
);
$form->setData($data);
 
if ($form->isValid()) {
    // $contact now looks like:
    // array(
    //     'name'    => 'John Doe',
    //     'email'   => 'j.doe@example.tld',
    //     'subject' => '[Contact Form] \'sup?',
    //     'message' => 'Type your message here',
    // )
    // only as an ArrayObject
}

Когда объект связан с формой, вызов «getData()» вернет этот объект по умолчанию. Если вместо объекта Вам нужен ассоциативный массив, то нужно передать флаг «FormInterface::VALUES_AS_ARRAY» в этот метод.

use ZendFormFormInterface;
$data = $form->getData(FormInterface::VALUES_AS_ARRAY);

ZendFramework использует несколько стандартных гидраторов. Их использование схоже с использованием «Zend\Stdlib\Hydrator\HydratorInterface»:

namespace Zend\Stdlib\Hydrator;
 
interface Hydrator\Interface
{
    /** @return array */
    public function extract($object);
    public function hydrate(array $data, $object);
}

Рендеринг

 

Компонент Form предоставляет набор помощников видов. Они принимают  различные объекты формы, анализируют их и создают соответствующую разметку. Обычно анализируются атрибуты, но при необходимости можно задать анализ и других свойств.

 

При подготовке к рендерингу нужно вызвать метод  «prepare()» -  который обеспечит инъекцирование.

 

Самыми простыми помощниками вида являются: Form, FormElement, FormLabel, FormElementErrors. Рассмотрим на примере:

<?php
// within a view script
$form = $this->form;
$form->prepare();
 
// Assuming the "contact/process" route exists...
$form->setAttribute('action', $this->url('contact/process'));
 
// Set the method attribute for the form
$form->setAttribute('method', 'post');
 
// Get the form label plugin
$formLabel = $this->plugin('formLabel');
 
// Render the opening tag
echo $this->form()->openTag($form);
?>
<div class="form_element">
<?php
    $name = $form->get('name');
    echo $formLabel->openTag() . $name->getOption('label');
    echo $this->formInput($name);
    echo $this->formElementErrors($name);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $subject = $form->get('subject');
    echo $formLabel->openTag() . $subject->getOption('label');
    echo $this->formInput($subject);
    echo $this->formElementErrors($subject);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $message = $form->get('message');
    echo $formLabel->openTag() . $message->getOption('label');
    echo $this->formTextarea($message);
    echo $this->formElementErrors($message);
    echo $formLabel->closeTag();
?></div>
 
<div class="form_element">
<?php
    $captcha = $form->get('captcha');
    echo $formLabel->openTag() . $captcha->getOption('label');
    echo $this->formCaptcha($captcha);
    echo $this->formElementErrors($captcha);
    echo $formLabel->closeTag();
?></div>
 
<?php echo $this->formElement($form->get('security')) ?>
<?php echo $this->formElement($form->get('send')) ?>
 
<?php echo $this->form()->closeTag() ?>

Для избегания проблем с подсветкой кода в IDE или редакторе используем теги открытия и закрытия как для формы (form) так и для лейблов (label).

 Так же в данном примере есть множество однотипных повторений. Можно создать вспомогательный скрипт вида или сложного помощника, для уменьшения количества кода.

Однако не все элементы создаются по одному шаблону: CSRF и «submit» не требуют элементов «label» и «error message».

 Помощник вида FormElement – создают разметку для других помощников.  Если Вы создаете нового помощника вида формы, то должны расширить FormElement, что б он знал какая разметка нужна.

 

Ваш файл вида может быть большим и иметь много повторений, даже если сделать вышеописанное. И пока еще не сделан однострочный помощник вида, лучшим выбором является использование помощника вида «FormRow». Он автоматически рендерит лейблы (label), если они заданы, используя помощник «FormElement», а так же ошибки.

 

Переделаем предыдущую форму с использованием этого помощника вида:

<?php
// within a view script
$form = $this->form;
$form->prepare();
 
// Assuming the "contact/process" route exists...
$form->setAttribute('action', $this->url('contact/process'));
 
// Set the method attribute for the form
$form->setAttribute('method', 'post');
 
// Render the opening tag
echo $this->form()->openTag($form);
?>
<div class="form_element">
<?php
    $name = $form->get('name');
    echo $this->formRow($name);
?></div>
 
<div class="form_element">
<?php
    $subject = $form->get('subject');
    echo $this->formRow($subject);
?></div>
 
<div class="form_element">
<?php
    $message = $form->get('message');
    echo $this->formRow($message);
?></div>
 
<div class="form_element">
<?php
    $captcha = $form->get('captcha');
    echo $this->formRow($captcha);
?></div>
 
<?php echo $this->formElement($form->get('security')) ?>
<?php echo $this->formElement($form->get('send')) ?>
 
<?php echo $this->form()->closeTag() ?>

Учтите, что он сам выводит лейблы. Если необходимо вывести их после элемента, то передайте необязательный параметр «append» в помощник вида «FormRow»:

<div class="form_element">
<?php
    $name = $form->get('name');
    echo $this->formRow($name, **'append'**);
?></div>

Использование преимуществ HTML5 атрибутов

 

HTML5 вносит много интересных функций, одна из которых – это упрощенная проверка форм.

Однако учтите, что при использовании атрибутов HTML5 – Zend не добавляет их автоматически в валидатор. Это нужно сделать вручную:

$form->add(array(
             'name' => 'phoneNumber',
             'options' => array(
                     'label' => 'Your phone number'
             ),
             'attributes' => array(
                     'type' => 'tel'
                     'required' => 'required',
                     'pattern'  => '^0[1-68]([-. ]?[0-9]{2}){4}$'
             )
     ));

Валидация групп

 

Иногда требуется проверка только части элементов формы. Предположим, что используем повторно контактную форму в веб - сервисе. Тогда «Csrf», «Captcha», и кнопка «submit» не требуют проверки. Zend\Form предоставляет прокси метод для метода InputFilter «setValidationGroup()», позволяющий реализовать вышеупомянутое:

$form->setValidationGroup('name', 'email', 'subject', 'message');
$form->setData($data);
if ($form->isValid()) {
    // Contains only the "name", "email", "subject", and "message" values
    $data = $form->getData();
}

Если же потом возникнет ситуация, которая потребует проверки всей формы, просто передайте флаг «FormInterface::VALIDATE_ALL» в метод «setValidationGroup()»:

use Zend\Form\FormInterface;
$form->setValidationGroup(FormInterface::VALIDATE_ALL);

Если Ваша форма содержит вложенности, можете использовать нотацию массива для проверки только части групп:

$form->setValidationGroup(array(
             'profile' => array(
             'firstname',
             'lastname'
             )
));
$form->setData($data);
if ($form->isValid()) {
    // Contains only the "firstname" and "lastname" values from the
    // "profile" fieldset
    $data = $form->getData();
}

Использование аннотаций (Annotations)

 

Создание полноценной формы часто бывает довольно утомительным занятием: создаете модель объекта, input filter, валидацию, объект формы для её последующего отображения, а так же гидратор для связи элементов и модели. Было бы хорошо определить все это в одном месте.

 

Решением являются – аннотации.

Вот, какие бывают аннотации:

 

AllowEmpty

Допускается пустое значение в «input». Эта аннотация не требует задания значений.

 

Attributes

Задает объект формы, группировки, элемента. Как значение принимает ассоциативный массив в формате JSON: @Attributes({"class":"zend_form","type":"text"}).

 

ComposedObject

Задает другие объекты с помощью аннотации для использования. Обычно используется, если объект ссылается на другой объект, который будет прикреплен в даьнейшем к форме или группировке. Как значение принимает строку, в которой указано имя класса, отвечающего за нужный объект.

 

ErrorMessage

Задает сообщение ошибки, если данные, введенные в форму не прошли проверки. Принимает как значение строку.

 

Exclude

Помечает, какое свойство нужно исключить из формы или группировки. Не требует указания значения.

 

Filter

Задает спецификации фильтра, который должен применяться к переданному элементу. Как значение, принимает ассоциативный массив, с ключом «name», указывающим на строку с именем фильтра, и ключом «options», указывающим на ассоциативный массив опций фильтра для конструктора: @Filter({"name": "Boolean", "options": {"casting":true}}). Может использоваться нужное количество раз.

 

Flags

Флаги для формы или группировки (fieldset) при создании элемента или группировки. Используется обычно для указания имени или приоритета. Как значение принимает ассоциативный массив: @Flags({"priority": 100}).

 

Hydrator

Указывает класс гидратора, который нужно использовать для заданной формы или группировки. Как значение принимает строку.

 

InputFilter

Задает класс «input filter» , который использовать к заданной форме или группировке. Как значение принимает строку.

 

Input

Задает класс «input», который использовать к заданному элементу. Как значение принимает строку.

 

Name

Задает имя текущего элемента, группы, формы. Как значение принимает строку.

 

 Options

Опции, которые должны быть переданы в форму или группировку и отвечающие за поведение этих объектов, но не являются атрибутами: labels, адаптер CAPTCHA и т.д. Как значение принимается ассоциативный массив: @Options({"label": "Username:"}).

 

Required

Указывает, является ли элемент обязательным для заполнения или нет. Как значении ожидается булевое значение. По умолчанию все элементы явдяются обязательными для заполнения (required). Тоесть эта аннотация, фактически, дает возможность отменить обязательность.

 

Type

Класс, используемый для текущего элемента, формы, группировки. Как значение принимает строку.

 

Validator

Спецификации валидатора для элемента. Принимается ассоциативный массив, с ключом «name», указывающий имя валидатора и ключом «options», состоящего из ассоциативного массива с опциями валидирования: @Validator({"name": "StringLength", "options": {"min":3, "max": 25}}). Используется столько раз, сколько нужно.

 

Для использования аннотаций просто пропишите и в вашем классе в формате аннотаций (docblocks).

 

Важно: Для использования аннотаций необходимо подключить Doctrine\Common, в которой содержится парсер аннотаций. Самый простой способ установить Doctrine\Common – использовать Composer.

"doctrine/common": ">=2.1",

Потомзапустите :

php composer.phar update

Для установки зависимостей.

 

Если же Вы хотите установить без использования Composer  - посетите сайт Doctrine .

 

Простой пример:

use ZendFormAnnotation;
 
/**
 * @Annotation\Name("user")
 * @Annotation\Hydrator("Zend\Stdlib\Hydrator\ObjectProperty")
 */
class User
{
    /**
     * @AnnotationExclude()
     */
    public $id;
 
    /**
     * @AnnotationFilter({"name":"StringTrim"})
     * @AnnotationValidator({"name":"StringLength", "options":{"min":1, "max":25}})
     * @AnnotationValidator({"name":"Regex", "options":{"pattern":"/^[a-zA-Z][a-zA-Z0-9_-]{0,24}$/"}})
     * @AnnotationAttributes({"type":"text"})
     * @AnnotationOptions({"label":"Username:"})
     */
    public $username;
 
    /**
     * @AnnotationType("ZendFormElementEmail")
     * @AnnotationOptions({"label":"Your email address:"})
     */
    public $email;
}

Этот пример создаст форму с именем «user», используя гидратор «Zend\Stdlib\Hydrator\ObjectProperty». Форма состоит из двух элементов: «username» и «email». Элемент «username» имеет фильтр «StringTrim» и два валидатора «StringLength», указывающего, что длина имени в символах должна составлять 1-25 символов,  и «Regex».

 

У элемента формы имеется атрибут «type» со значением «text» и «label» со значением «Username:». Элемент «email» имеет тип «Zend\Form\Element\Email», и «label» со
значением «Your email address:».

 

Для использования всего вышенаписанного необходим «Zend\Form\Annotation\AnnotationBuilder»:

use Zend\Form\Annotation\AnnotationBuilder;
 
$builder = new AnnotationBuilder();
$form    = $builder->createForm('User');

Важно: Эта форма не является полным рабочим примером. Вам еще необходимо добавить элемент защиты «CSRF» и кнопку «submit».  Мы рекомендуем создать группу с этими элементами и подключить её, используя аннотации.

Автор статьи: DuB