RESTful Api используя Zend framework 2

Небольшой гайд по созданию простейшего RESTful api с помощью Zend framework 2 (далее zf2).


Нам потребуется zf2 v2.3@dev, а так же Doctrine 2 ORM.

Итак, начнем с создания структуры директорий нашего api:

mkdir -pv zf2-api/{config/autoload,public,module/v1/{config,src/v1/{Controller,Service,Entities}}}


Загружаем композер
curl -sS https://getcomposer.org/installer | php

Так же нам потребуется создать composer.json с такими зависимостями и установить их.
"require": {
        "php": ">=5.4",
        "zendframework/zendframework": "2.*@dev",
        "doctrine/doctrine-orm-module" :"0.*"
    }


Входную точку public/index.php мы полностью скопируем с zf2 skeleton appliaction:

<?php

chdir(dirname(__DIR__));

// Так же мы возьмем инициализацию автозагрузчика
require 'init_autoloader.php';

define('BASE_DIR', dirname(__DIR__));

// Run the application!
Zend\Mvc\Application::init(require 'config/application.config.php')->run();


Создаем конфиг application.config.php для запуска нашего приложения, наш модуль будет называется v1 соответственно версии api:

return array(
    // Загружаеммые модули
    'modules' => array(
        'v1',
        'DoctrineModule',
        'DoctrineORMModule',
    ),
    // Настройка "слушателей для ModuleManager
    'module_listener_options' => array(
        'module_paths' => array(
            './module',
            './vendor',
        ),
        // Настройка путей для глобальных и локальных конфигов
        'config_glob_paths' => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
        // Включаем проверку зависимости модулей
        'check_dependencies' => true,
    ),
);


Теперь давайте создадим главный класс нашего модуля module/v1/Module.php:

<?php
/**
 * Description of Module
 *
 * @author cawa
 */

namespace v1;

class Module
{
    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }
}


А так же простейший конфиг для него module/v1/config/module.config.php:

<?php

/**
 * Конфиг модуля v1
 *
 * @author cawa
 */

namespace v1;

return array(
    'router' => array(
        'routes' => array(
            'api' => array(
                'type' => 'Segment',
                'options' => array(
                    'route' => '/api/v1/[:action][/:id]',
                    'constraints' => array(
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*/?',
                    ),
                    'defaults' => array(
                        '__NAMESPACE__' => 'v1\Controller',
                        'controller' => 'v1\Controller\Index',
                        'action' => 'index'
                    ),
                ),
            ),
        ),
    ),
    'controllers' => array(
        'invokables' => array(
            'v1\Controller\Index' => 'v1\Controller\IndexController',
        ),
    ),
    'view_manager' => array(
        'strategies' => array(
            'ViewJsonStrategy',
        ),
        'display_not_found_reason' => true,
        'display_exceptions' => true,
        'doctype' => 'HTML5'
    ),
    'doctrine' => array(
        'driver' => array(
            __NAMESPACE__ . '_driver' => array(
                'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                'cache' => 'array',
                'paths' => array(__DIR__ . '/../src/' . __NAMESPACE__ . '/Entity')
            ),
            'orm_default' => array(
                'drivers' => array(
                    __NAMESPACE__ . '\Entity' => __NAMESPACE__ . '_driver'
                )
            )
        ),
    ),
    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
            ),
        ),
    ),
);


И наш единственный контроллер module/v1/src/v1/Controller/IndexController:

<?php
/*
  Document   : IndexController
  Created on : 28.10.2013, 11:37:11
  Author     : cawa
  Description:
  Index controller
 */

namespace v1\Controller;

use Zend\Mvc\Controller\AbstractRestfulController,
    Zend\View\Model\JsonModel;

class IndexController extends AbstractRestfulController
{

    public function indexAction()
    {
        $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default');
        $testEntity = $em->getRepository('v1\Entity\Test')->findAll();
        
        //да не очень хорошее решение, но просто показать подойдет
        foreach ($testEntity as $entity) {
           $array[] = $entity->getJsonData();
         
        }
        return new JsonModel(array('response' => $array));
    }

}


Далее запускаем cli сервер php -S localhost:8000 из папки public, и переходим по ссылке localhost:8000/api/v1/index, получаем ответ от сервера.

P.S.
github: zf2-api
Если возникли какие-то вопросы, пишите комментарии, с радостью отвечу.
Если кого-то заинтересует, могу продолжить более подробным гайдом.
  • +3
  • 12,6k
  • 7
Поделиться публикацией

Похожие публикации

Комментарии 7
    +2
    Это туториал для copy/paste, вы бы добавили объяснений что к чему, почему именно так, а не иначе, какие ещё могут быть варианты.
      –1
      Ну так я и говорю, что если кому-то интересно, могу написать более подробный топик, это скажем так, была проба пера была.
      0
      вот тут официальные рекомендации для этого
        0
        у O’Phinney вообще много интересных материалов, иногда консультируюсь у него или других контрибуторов zf, в irc
        Например SOA хорошие слайды, хоть и старые
        +1
        Как-то совсем уж поверхностно.

        Обсуждение такой темы как RESTful Api используя Zend framework 2 не может быть полным без: www.apigility.org
          0
          абсолютно согласен
          пользовался недавно, довольно интересная штука.
          правда возникла проблема, что при включенном Zend OP Cache она отказывается работать
            0
            а в доках написано — отключать этот модуль. У меня при первой установки этого модуля так закешировались страницы, что я не могу их вытащить из кеша! В общем надо конфигурить

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

        Самое читаемое