Модули Zend Framework 2.0. Разработка модуля Zend Framework 2.0

АвторРоман Наумов Модули Zend Framework 2.0. Разработка модуля Zend Framework 2.0
12.12.2014
5046
8
Мне понравилось

Как и обещал продолжаю знакомить Вас с Zend Framework 2.0.
В Zend Framework 2.0 модуль можно определить как единицу программного обеспечения, которую можно переносить, многократно использовать и связывать с другими модулями для создания более крупных и сложных приложений. 

В Zend Framework 2 модули применяются совершенно особым образом они могут совместно использоваться несколькими системами, а действия по их переупаковке и распространению относительно просты. Существенное нововведение в Zend Framework 2  заключается в том, что теперь даже application является модулем.

Некоторые ключевые преимущества модулей Zend Framework 2.0:

  • управление зависимостями;
  • поддержка упаковки с помощью программы Phar и распространения с помощью
    инструмента Pyrus;
  • легковесность и быстродействие;
  • автономность, переносимость, возможность многократного использования;

Итак, начнем создание собственного модуля

Представим, что нам нужно создать новый модуль Users в Zend Frame­work 2.0, который будет управлять пользователями, в том числе осуществлять их регистрацию, аутентификацию и т. д.
Для этого мы пойдем по самому быстрому и простому пути, а именно задействуем модуль ZendSkeletonModule из состава Zend Framework.

  1. Переходим в папку module нашего приложения:
    $ cd /var/www/CommunicationApp/
    $ cd module/
  2. Выполняем клонирование модуля ZendSkeletonModule, назвав клон — Users (можете назвать по-своему):
    $ git clone git://github.com/zendframework/ZendSkeletonModule.git Users
  3. По окончании работы структура папок должна выглядеть следующим образом.
  4. Редактируем файл Module.php, который расположен в CommunicationApp/module/Users/module.php. Изменяем пространство имен на Users. Заменяем namespace ZendSkeletonModule на namespace Users;
  5. Папки  Users/src/ZendSkeletonModule и Users/view/zend-skeleton-module удаляем, поскольку мы не будем их использовать в данном проекте.

В новой MVC-структуре Zend Framework 2 все модели, представления и контроллеры сгруппированы по модулям. Каждый модуль имеет свой набор моделей, представлений и контроллеров, используя некоторые компоненты совместно с другими модулями.

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

  1. Переходим в папку модуля:
    $ cd /var/www/CommunicationApp/module/Users
  2. Создаем папку для контроллеров:
    $ mkdir -p src/Users/Controller/
  3. Создаем новый файл IndexController в папке <имя модуля>/src/<имя модуля>/Controller/:
    $ cd src/Users/Controller/
    $ vim IndexController.php
  4. В файл IndexController пишем следующее:
    namespace Users\Controller;
    
    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;
    
    class IndexController extends AbstractActionController
    {
    
        public function indexAction()
        {
            $view = new ViewModel();
            return $view;
        }
    
        public function registerAction()
        {
            $view = new ViewModel();
            $view->setTemplate('users/index/new-user');
            return $view;
        }
    
        public function loginAction()
        {
            $view = new ViewModel();
            $view->setTemplate('users/index/login');
            return $view;
        }
    
    }
  5. Этот код выполняет следующие действия: если пользователь посещает домашнюю страницу, то ему выводится представление, предлагаемое по умолчанию; если пользователь совершает действие register, то ему выводится шаблон newuser; если пользователь совершает действие login, то выводится шаблон login.
  6. Создаем папки для представлений:
    $ cd /var/www/CommunicationApp/module/Users
    $ mkdir -p view/users/index/
  7.  Переходим в папку представлений <модуль>/view/<имя модуля>/index:
    $ cd view/users/index/
  8. Создаем следующие файлы представлений:
    1) view/users/index/index.phtml
    <h1>Welcome to Users Module</h1>
    <br />
    <a href="/users/index/login">Login</a> | <a href="/users/index/register">New User Registration</a>
    

    2) /users/index/login.phtml

    <h2>Login</h2>
    <p>This page will hold the content for the login form</p>
    <br />
    <a href="/users">&lt;&lt; Back to Home</a>

    3) /view/users/index/new-user.phtml

    <h2>New User Registration</h2>
    <p>This page will hold the content for the registration<br />form</p>
    <br />
    <a href="/users">&lt;&lt; Back to Home</a>

     

Далее мы внесем изменения в конфигурацию модуля Users, чтобы он мог работать с созданными контроллером и представлениями.

  1. Конфигурирование автозагрузчика. Конфигурация автозагрузчика, предлагаемая по умолчанию модулем ZendSkeletonModule, должна быть отключена. Для этого можно отредактировать файл autoload_classmap.php, заменив его содержимое следующим:
    return array();
  2. Конфигурирование модуля. Конфигурацию модуля можно найти в файле config/module.config.php. Этот файл необходимо обновить, поместив в него информацию о созданных контроллерах и представлениях следующим образом.

    Контроллеры. По умолчанию привязка контроллеров указывает на модуль ZendSkeletonModule; ее нужно заменить следующей:
    'controllers' => array(
            'invokables' => array(
                ˈUsers\Controller\Indexˈ =>
                ˈUsers\Controller\IndexControllerˈ,
            ),
        ),

    Представления. Представления модуля необходимо связать с их местоположениями. Обратите внимание на то, что имена представлений записаны в нижнем регистре и разделены дефисом (например, обращение к ZendSkeleton будет выглядеть как zendskeleton):
     'view_manager' => array(
            'template_path_stack' => array(
                'users' => __DIR__ . '/../view',
            ),
        ),

    Маршруты. Последнее действие по конфигурированию модуля — определение маршрута доступа к этому модулю из браузера. В данном случае мы определяем маршрут как /users, который указывает на действие index в контроллере Index модуля Users:
        'router' => array(
            'routes' => array(
                'users' => array(
                    'type' => 'Literal',
                    'options' => array(
                        'route' => '/users',
                        'defaults' => array(
                            '__NAMESPACE__' =>
                            'Users\Controller',
                            'controller' => 'Index',
                            'action' => 'index',
                        ),
                    ),
                ),
            ),
        ),
  3. Дабы избежать ошибок вот итоговый конфигурационный файл:
    return array(
        'controllers' => array(
            'invokables' => array(
                'Users\Controller\Index' =>
                'Users\Controller\IndexController',
            ),
        ),
        'router' => array(
            'routes' => array(
                'users' => array(
                    'type' => 'Literal',
                    'options' => array(
                        // Измените в соответствии с вашим модулем
                        'route' => '/users',
                        'defaults' => array(
                            // Задайте это значение согласно пространству
                            // имен, в котором находятся ваши контроллеры
                            '__NAMESPACE__' => 'Users\Controller',
                            'controller' => 'Index',
                            'action' => 'index',
                        ),
                    ),
                    'may_terminate' => true,
                    'child_routes' => array(
                        // Это маршрут, предлагаемый по умолчанию. Его разумно
                        // использовать при разработке модуля;
                        // с появлением определенности в отношении
                        // маршрутов для модуля, возможно, появится
                        // смысл указать здесь более точные пути.
                        'default' => array(
                            'type' => 'Segment',
                            'options' => array(
                                'route' =>
                                '/[:controller[/:action]]',
                                'constraints' => array(
                                    'controller' =>
                                    '[a-zA-Z][a-zA-Z0-9_-]*',
                                    'action' =>
                                    '[a-zA-Z][a-zA-Z0-9_-]*',
                                ),
                                'defaults' => array(),
                            ),
                        ),
                    ),
                ),
            ),
        ),
        'view_manager' => array(
            'template_path_stack' => array(
                'users' => __DIR__ . '/../view',
            ),
        ),
    );

     

  4. Конфигурирование приложения. Включите модуль в конфигурацию приложения: это можно сделать, изменив файл config/application.config.php и добавив модуль Users в список подключенных модулей:
    'modules' => array(
            'Application',
            'Users',
        ),

Вот и все, мы создали модуль Users. Чтобы протестировать модуль, откройте ссылку http://comm-app.local/users/ в веб-браузере; вы должны иметь возможность перемещаться внутри модуля.




В следующих статьях я покажу как расширить возможности данного модуля до уровня полноценного приложения.