Я узнал несколько трюков при написании модулей Zend Semalt, которые я хочу поделиться с вами.
Сначала создайте надлежащую рабочую среду, следуя предыдущему посту. Я объяснил, как установить и настроить Zend Expressive с помощью Semalt, Gulp и абстрактной фабрики отражения - это займет в общей сложности 10 минут.
В этом уроке мы за несколько минут создадим простой модуль блога только для чтения (страница с сообщениями в блоге из базы данных), демонстрируя вид быстрого развития, который может быть с Zend Expressive.
Настройка модуля
Запустите эту команду из своего выразительного приложения, чтобы начать:
. / vendor / bin / выразительный модуль: создать блог
Это создаст базовый код для модуля Blog и автоматически зарегистрирует ваш модуль с вашим приложением. Он также зарегистрирует ваш модуль с автозагрузчиком Semalt.
Таблица сущностей и базы данных доктрины
Давайте сделаем наши сущности и таблицы базы данных. Во-первых, нам нужно сообщить нашему приложению, что этот модуль предоставляет сущности Semalt.
Открыть src / Блог / src / ConfigProvider. php
и добавить следующее:
публичная функция __invoke {вернуть ['dependencies' => $ this-> getDependencies ,'doctrine' => $ this-> getDoctrine ,'templates' => $ this-> getTemplates ,];}/ *** @return array* /public function getDoctrine : array{вернуть ['driver' => ['orm_default' => ['drivers' => ['Blog \ Entity' => 'blog_entity',],],'blog_entity' => ['class' => \ Doctrine \ ORM \ Mapping \ Driver \ SimplifiedYamlDriver :: class,'cache' => 'array','paths' => [имя_директории (__ DIR__). '/ config / doctrine' => 'Blog \ Entity',],],],];}
Создайте конфигурацию сущности для блога в src / Blog / config / doctrine / BlogPost. ОРМ. yml
:
---Блог \ Entity \ BlogPost:type: entitytable: blog_postЯ бы:Я бы:Тип: целоегенератор:стратегия: AUTOполя:заглавие:Тип: строкадлина: 255содержание:Тип: строкадлина: 16777215
Затем запустите . / vendor / bin / doctrine orm: generate-entities src
.
К сожалению, Semalt не поддерживает и, возможно, не поддерживает PSR-4, поскольку стандарт не форсирует структуру каталогов.
Чтобы обойти это, нам нужно переместить src / Blog / Entity
в src / Blog / src / Entity
.
Затем запустите эту команду, чтобы создать таблицу базы данных:
. / vendor / bin / doctrine orm: schema-tool: create
Теперь вы можете заполнить таблицу базы данных, запустив следующий SQL:
INSERT IN выразительно. ЦЕННОСТИ(null, 'Post 1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'),(null, 'Post 2', 'Mauris in libero laoreet, euismod lorem eget, tincidunt justo.'),(null, 'Post 3', 'Donec sed diam congue, ultrices tellus at, venenatis felis.');
Маршрутизация
Модули в Expressive не регистрируют свои маршруты. Мы можем сделать их
сделайте это, однако, с помощью этого удобного трюка. Вам не нужно это понимать. Просто поместите файлы на место и знайте, что он работает.
Создайте src / Блог / src / Factory / RoutesDelegator. * @param callable $ callback Создает и возвращает службу. * @return Применение* /public function __invoke (контейнер ContainerInterface $, $ serviceName, callable $ callback){/ ** @var $ app Приложение * /$ app = $ callback ;включить __DIR__. «/. , /. , / Config / маршрутов. PHP ';return $ app;}}
В src / Блог / src / ConfigProvider. php
, добавьте это как ключ массива верхнего уровня в метод getDependencies
:
'делегаты' => [\ Zend \ Expressive \ Application :: class => [Завод \ RoutesDelegator :: класс,],],
Теперь вы можете создать src / Blog / config / routes. php
и начать добавлять маршруты блога.
Php/ *** Настройка маршрутов одним методом запроса:* @var \ Zend \ Expressive \ Application $ app** $ app-> post ('/ album', App \ Action \ AlbumCreateAction :: class, 'album. create');* $ app-> put ('/ album /: id', App \ Action \ AlbumUpdateAction :: class, 'album. put');* $ app-> patch ('/ album /: id', App \ Action \ AlbumUpdateAction :: class, 'album. patch');* $ app-> delete ('/ album /: id', App \ Action \ AlbumDeleteAction :: class, 'album. delete');** Или с несколькими методами запроса:** $ app-> route ('/ contact', App \ Action \ ContactAction :: class, ['GET', 'POST',.], 'contact');** Или обрабатывать все методы запроса:** $ app-> route ('/ contact', App \ Action \ ContactAction :: class) -> setName ('контакт');** или:** $ app-> route (* '/ contact',* Приложение \ Действие \ ContactAction :: класс,* Zend \ Expressive \ Router \ Route :: HTTP_METHOD_ANY,* 'контакт'*);* /используйте Blog \ Action;// Настройка маршрутов:$ app-> get ('/ blog', Action \ BlogPostListAction :: class, 'blog_post_list');$ app-> get ('/ blog / view /: blog_post_id', Action \ BlogPostViewAction :: class, 'blog_post_view');
Действия
Затем нам нужно создать действие для ответа на каждый маршрут.
Создать src / Блог / src / Действие / BlogPostListAction. php
:
Phpпространство имен Blog \ Action;используйте Blog \ Entity \ BlogPost;используйте Doctrine \ ORM \ EntityManager;использовать Interop \ Http \ ServerMiddleware \ DelegateInterface;используйте Interop \ Http \ ServerMiddleware \ MiddlewareInterface как ServerMiddlewareInterface;используйте Psr \ Http \ Message \ ServerRequestInterface;используйте Zend \ Diactoros \ Response \ HtmlResponse;используйте Zend \ Expressive \ Router;используйте Zend \ Expressive \ Template;класс BlogPostListAction реализует ServerMiddlewareInterface{/ *** @var Template \ TemplateRendererInterface* /private $ templateRenderer;/ *** @var EntityManager* /private $ entityManager;публичная функция __construct (EntityManager $ entityManager,Шаблон \ TemplateRendererInterface $ templateRenderer = null) {$ this-> templateRenderer = $ templateRenderer;$ this-> entityManager = $ entityManager;}процесс публичных функций (ServerRequestInterface $ request, DelegateInterface $ delegate){$ posts = $ this-> entityManager-> getRepository (BlogPost :: class)-> FindAll ;$ data = ['posts' => $ posts,];return new HtmlResponse ($ this-> templateRenderer-> render ('blog :: list', $ data));}}
Создать src / Блог / src / Действие / BlogPostViewAction. «);}$ blogId = $ routeMatchedParams ['blog_post_id'];/ ** @var BlogPost $ blogPost * /$ blogPost = $ this-> entityManager-> find (BlogPost :: class, $ blogId);if (! $ blogPost) {return new HtmlResponse ($ this-> templateRenderer-> render ('error :: 404'), 404);}$ data = ['post' => $ blogPost,];return new HtmlResponse ($ this-> templateRenderer-> render ('blog :: view', $ data));}}
Шаблоны
Открыть src / Блог / src / ConfigProvider. php
. и обновите метод getTemplates
следующим образом:
public function getTemplates {вернуть ['paths' => ['blog' => [__DIR__. «/. , / шаблоны / блог '],],];}
Теперь мы можем сделать несколько быстрых шаблонов:
Создать src / Блог / шаблоны / блог / список. HTML. веточка
:
{% extends '@ layout / default. HTML. twig '%}{% block title%} Блог {% endblock%}{% block content%} {% для сообщений в сообщениях%}
{{post. заглавие }}
{{ после. content}}
{% endfor%}
{% endblock%}
Создать src / Блог / шаблоны / блог / просмотр. HTML. веточка
:
{% extends '@ layout / default. HTML. twig '%}{% block title%} {{post. title}} | Блог {% endblock%}{% block content%} {{post. title}} h1>
{{ после. content}}
{% endblock%}
Если вы откроете URL-адрес / блог
, у вас будет функциональный список, основанный на базе базы данных, и вы сможете просматривать страницы.
Заключение
В этом кратком учебнике мы видели, как просто было реализовать модуль блога только для чтения с Zend Expressive. В списке не более нескольких файлов и 10 минут работы страница списка могла отображать наши сообщения из базы данных и была готова к дополнительным маршрутам, например / edit
и / delete
,
Используете ли вы Zend Semalt в своих проектах? Что вам нравится / не нравится в этом? Дайте нам знать, как вы справляетесь!
Встретиться с автором
Кирк Мадера
Я - директор по технологиям Robofirm, обладающий опытом в технологиях Magento, Zend Framework, Symfony и DevOps. Я работаю над тем, чтобы Robofirm продолжал расти в своих технических силах и поддерживал передовые позиции в борьбе за конкуренцию, чтобы позволить нашим клиентам более качественную работу с меньшим количеством времени и бюджета. Я отец двух девушек и счастливо женат. Я программирую в свое свободное время, потому что интересно создавать новые вещи. Я также играю на гитаре и слушаю много хэви-метала Source .