Содержание


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


Быстрый старт, Quick Start, ЗФ2, Zend Framework 2, ZF2, ру, ru




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

 


Установка Zend Skeleton Application

 

Самый простой способ – это скачать каркас приложения и модули с репозитория.  Это можно сделать несколькими способами:

 

Используя Composer

prompt> git clone git://github.com/zendframework/ZendSkeletonApplication.git my-application

Затем запустите команду установки Composer’а для установки библиотеки ZF  и других связанных компонентов.

prompt> php ./composer.phar install

Используя Git

 

Просто скопируйте репозиторий ZendSkeletonApplication, используя опцию –recursive, которая так же установит и сам ZF.

 

Ручная установка

 

- Скачать архив ZendSkeletonApplication

Zip: https://github.com/zendframework/ZendSkeletonApplication/zipball/master

Tarball: https://github.com/zendframework/ZendSkeletonApplication/tarball/master

 

-Разархивируйте и переименуйте папку в название Вашего проекта (приложения, сайта). Мы назовем проект «my-application».

 

-Установите Zend Framework2, указав  путь к его библиотеке «library» в PHP include_path и создав символическую ссылку на «library», или же установите непосредственно в приложение, используя Pyrus.  Или же скачайте архив ZF2 :https://github.com/zendframework/zf2/ и скопируйте папку «library» из него в папку ZendSkeletonApplication/vendor/ZF2/.

 

Создание нового модуля

 

По умолчанию, один модуль уже присутствует в ZendSkeletonApplication и называется «Application». В нем реализован контроллер для обработки страницы «home», шаблон макета, шаблон для страницы ошибки с номером 404.

 

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

 

Основная и дополнительная функциональность сайта обеспечивается созданием новых  модулей.

 

 

Для создания модулей советуем использовать ZendSkeletonModule как базис. Скачать его можно с

Zip: https://github.com/zendframework/ZendSkeletonModule/zipball/master

Tarball: https://github.com/zendframework/ZendSkeletonModule/tarball/master

 

Разархивируйте и переименуйте папку таким образом, что б название отображало функционал модуля. Потом переместите папку в директорию «modules/».

 

Наступило время заняться созданием базового функционала.

 

Обновление класса Module

 

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

 

Для начала сделаем так, что б autoload_classmap.php возвращал пустой массив:

<?php
// autoload_classmap.php
return array();

Так же нужно изменить файл config/module.config.php следующим образом:

return array(
    'view_manager' => array(
        'template_path_stack' => array(
            '<module-name>' => __DIR__ . '/../view'
        ),
    ),
);

Заполните «module-name» именем модуля, учитывая следующее:

- буквы в нижнем регистре (маленькие)

-префикс принадлежности и название модуля разделяются «-» (тере). Например модуль «ZendUser» превратится в «zend-user».

 

На следующем шаге изменим файл Module.php:

namespace <your module name here>;
 
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\ModuleManager\Feature\ConfigProviderInterface;
 
class Module implements AutoloaderProviderInterface, ConfigProviderInterface
{
    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }
 
    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }
}

На данном этапе настройка модуля завершена. Приступим к созданию контроллера.

 


Создание контроллера

 

Контроллеры представляют собой объекты, реализуюшие Zend\Stdlib\DispatchableInterface. Это означает, что они должны реализовать метод dispatch(), который принимает объект Request как аргумент.

 

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

 

- Zend\Mvc\Controller\AbstractActionController – позволяет маршрутам находить правильные действия (action). При совпадении, метод с названием  «название+Action» будет вызван контроллером. Например, если у Вас есть маршрут (роут), возвращающий «foo» как ключ действия (action), то будет вызван метод «fooAction()».

 

- Zend\Mvc\Controller\AbstractRestfulController – занимается автоопределением запроса (Request) для определения, какой метод http использовался, и вызывает соответствующий метод.

 

GET вызовет метод getList(). Или же, если заранее был задан и согласован «id», то вызовется метод get() с этим значением идентификатора.

 

POST  вызовет метод create(), передавая значения в $_POST.

 

PUT . Необходим «id», для согласования маршрутизации. Вызовет метод update(), передав в него идентификатор, и все данные, которые находятся в сыром теле post (raw post body).

 


DELETE . Необходим «id», для согласования маршрутизации. Вызовет метод delete().

 

Создадим контроллер, в стиле «hello world» с одним единственным действием (action). Создадим директорию «src/<module name>/Controller», а в ней файл «HelloController.php». Содержимое этого файла приведено ниже:

<?php
namespace <module name>Controller;
 
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
 
class HelloController extends AbstractActionController
{
    public function worldAction()
    {
        $message = $this->params()->fromQuery('message', 'foo');
        return new ViewModel(array('message' => $message));
    }
}

Разберем более подробно, что мы только что создали:

 

-Создали контроллер действия.

-Создали действие (action), с именем «world».

-Вытянули сообщение из списка параметров (В данном случае это сделано для упрощения. В реальной ситуации всегда проверяйте входящие извне данные).

-Вернули объект ViewModel с массивом значений для последующей обработки.

 

 Разберемся с ViewModel. Слой визуализации (view) будет использоваться при рендеринге, получая переменные и шаблоны из него. По умолчанию, не обязательно указывать имя шаблона, тогда оно будет брать шаблон, основываясь на таких данных: «имя_контролера_в_нижнем_регистре/имя_действия_в_нижнем_регистре». Однако, при необходимости Вы можете задать другие правила, используя метод setTemplate() экземпляра ViewModel. Как правило, шаблоны размещаются в файлах с расширением «*.phtml».

 

Перейдем к созданию скрипта вида.

 

Создание скрипта вида

 

Создайте директорию «view/<module-name>/hello». Внутри неё создайте файл «world.phtml». Содержимое файла должно быть таким:

<h1>Greetings!</h1>
 
<p>You said "<?php echo $this->escapeHtml($message) ?>".</p>

Сохраните изменения.

 

Важно: Метод escapeHtml() представляет собой помощник вида, который помогает в устранении уязвимости при XSS атаках на  Ваш сайт. Никогда не оставляйте данные, вводимые пользователями без проверки. Используйте соответствующий помощник вида, в зависимости от типа вводимых данных.

 

 

Создание маршрута

 

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

 

Важно: ZendSkeletonApplication идет с роутингом по умолчанию. Для его настройки используется такая маска: « /{module}/{controller}/{action} ». На практике получите такой маршрут: «/zend-user/hello/world». В этой статье мы создаем маршрут, просто что б показать как это работает. В реальных же словиях Вы получите достаточно гибкий инстумент, благодаря которому сможете удовлетворить свои самые смелые требования маршрутизации ).

 

Сначала приложение ищет экземпляр Zend\Mvc\Router\RouteStack для установки маршрутизации. По умолчанию маршрутизация создается Zend\Mvc\Router\Http\TreeRouteStack.

 

Для получения базовой функциональности маршрутизатора необходимо заменить <module-name> на имя Вашего модуля.

// module.config.php
return array(
    '<module-name>' => array(
        'type'    => 'Literal',
        'options' => array(
            'route'    => '/<module-name>',
            'defaults' => array(
                'controller'    => '<module-namespace>\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(
                    ),
                ),
            ),
        ),
    ),
    // ... other configuration ...
);

Так же необходимо известить наше приложение о созданном нами контроллере следующим образом:

// module.config.php
return array(
    'controllers' => array(
        'invokables' => array(
            '<module-namespace>\Controller\Index' => '<module-namespace>\Controller\IndexController',
            // Do similar for each other controller in your module
        ),
    ),
   // ... other configuration ...
);

Важно: Мы информируем приложение о тех контроллерах, которые должны будут работать в нашем приложении. Это сделано для того, что б никто не смог запросить любой сервис, про который известно в ServiceManager’е, в попытки взломать приложение.Диспетчер использует специальные контейнеры, с ограниченной областью для хранения контроллеров, которые были зарегистрированы в нем с помощью invokе классы или фабрики. 

 

Откройте файл config/module.config.php и измените его следующим образом, добавив маршруты и контролеры:

return array(
    'router' => array(
        'routes' => array(
            '<module name>-hello-world' => array(
                'type'    => 'Literal',
                    'options' => array(
                    'route' => '/hello/world',
                    'defaults' => array(
                        'controller' => '<module name>\Controller\Hello',
                        'action'     => 'world',
                    ),
                ),
            ),
        ),
    ),
    'controllers' => array(
        'invokables' => array(
            '<module namespace>\Controller\Hello' => '<module namespace>\Controller\HelloController',
        ),
    ),
    // ... other configuration ...
);

Проинформирум Приложение о новом Модуле

 

По умолчанию, новые модули не работают, пока мы сами не укажем на них в module manager. Исправим файл config/application.config.php:

<?php
return array(
    'modules' => array(
        'Application',
        '<module namespace>',
    ),
    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),
);

Замените <module namespace> на название Вашего модуля.

 

 


Тестирование

 

Создайте новый хост с главной папкой «public». Запустите браузер и зайдите на Ваш сайт. Вы должны увидеть страницу со стандартным приветствием ZendSkeletonApplication.

 

После добавьте в путь «/hello/world». Вы должны увидеть следующие:

<h1>Greetings!</h1>
 
<p>You said "foo".</p>

Теперь добавьте в строке адреса следующую строку: «?message=bar». Вы должны увидеть следующие:

<h1>Greetings!</h1>
 
<p>You said "bar".</p>

Поздравляем! Только что Вы создали свое первой модульное MVC приложение на  ZF2 !


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