Небольшой гайд по созданию простейшего 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
Если возникли какие-то вопросы, пишите комментарии, с радостью отвечу.
Если кого-то заинтересует, могу продолжить более подробным гайдом.
ссылка на оригинал статьи http://habrahabr.ru/post/199502/
Добавить комментарий