ZF2, что лучше всего подходит для работы с модулями форм модуля Vendor?

Как я могу применить пользовательские стили к форме модуля поставщика или встроить ее в свой собственный вид script? В частности, я хочу работать с формами, предоставляемыми модулем EdpUser (https://github.com/EvanDotPro/EdpUser).

Самый простой способ - изменить поставщика script напрямую. Но, очевидно, это будет противоречить будущим обновлениям поставщиков.

Другим способом, похоже, является копирование Vendor Controller в мой собственный модуль, а затем мои собственные представления. Однако это связано с аналогичной проблемой: синхронизация с будущими обновлениями Vendor. И мне придется быть осторожным с пространством имен.

Возможно, я должен расширить Vendor Controller вместо копирования. Это должно хорошо работать с пространствами имен, и я должен иметь доступ к формам внутри моего контроллера довольно легко. При использовании моих собственных сценариев просмотра. Правильно ли это или есть лучший?

Спасибо

Ответ 1

Не рекомендуется использовать что-либо в каталоге модуля, особенно те модули, которые помещаются в /vendor/. Это также причина того, что шаблоны конфигурации должны быть скопированы в ваш собственный каталог /config/autoload/.

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

Изменить маршрут

Модуль ZfcUser регистрируется под URL-адресом/user. Если вы хотите изменить это в /account, например, вы можете просто добавить это в свою конфигурацию:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'route' => '/account',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

Измените контроллер

Если вы недовольны тем, что используется ZfcUser\Controller\UserController, и вы хотите переопределить некоторые действия в этом контроллере, вы можете создать настраиваемый контроллер, например MyUser\Controller\UserController. Если вы расширяете ZfcUser\Controller\UserController и предоставляете эту конфигурацию, вы готовы к работе:

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'defaults' => array(
                                    'controller' => 'MyUser\Controller\UserController'
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

Вы также можете использовать DI aliasing для переопределения псевдонима zfcuser в вашей конфигурации DI:

<?php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'zfcuser' => 'MyUser\Controller\UserController'
            ),
        ),
    ),
);

Измените экземпляр формы

Например, модуль ZfcUser запускает несколько событий, чтобы помочь другим модулям подключиться к процессу создания формы. И ZfcUser\Form\Login как ZfcUser\Form\Register запускают событие init после того, как они настроили все элементы формы. Это дает вам возможность добавлять или удалять элементы.

use Zend\EventManager\StaticEventManager;

$events = StaticEventManager::getInstance();
$events->attach('ZfcUser\Form\Login', 'init', function ($e) {
  $form = $e->getTarget();
  $form->addElement('text', 'something-new');
});

Мне нужно сделать два замечания здесь:

  • Каждый модуль должен предоставлять свои собственные триггеры. Этот ZfcUser имеет init в обеих формах, но это не задано для каждого модуля. Вы должны изучить документацию или исходный код, чтобы узнать об этом.
  • Zend\EventManager в настоящее время находится под рефакторингом для замены singleton StaticEventManager экземпляром SharedEventManager, который может быть создан через локатор Zend\Di. Вы можете посмотреть прогресс этого рефакторинга в этот запрос Pull.

Изменение вида или формы рендеринга

По этот RFC компонент Zend\Form, скорее всего, изменится. Специально для рендеринга декораторы будут удалены, и вместо этого "просто" обычные помощники видят форму. С учетом этого, плюс возможность переопределить представления, очень легко изменить рендеринг действия, просто используя другой модуль с только некоторыми сценариями представления.

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

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\View\Resolver\TemplatePathStack' => array(
                'parameters' => array(
                    'paths' => array(
                        'myuser' => __DIR__ . '/../view',
                    ),
                ),
            ),
        ),
    ),
);

Теперь вы можете создавать сценарии вида в своем каталоге view. Если у вас есть модуль под названием "MyUser" и находится под /modules/MyUser, и вы хотите переопределить вид входа script из ZfcUser (расположенный в /vendor/ZfcUser/view/zfcuser/login.phtml), создайте свое представление script в /modules/MyUser/view/zfcuser/login.phtml.