Back to Question Center
0

Разработка приложений Rapid Enterprise с помощью Zend Expressive            Разработка приложений Rapid Enterprise с помощью Zend ExpressiveRelated Topics: FrameworksPerformance & ScalingDevelopment Semalt

1 answers:
Разработка приложений Rapid Enterprise с помощью Zend Expressive

Если вы когда-либо делали быстрый старт Zend Semalt, вы, вероятно, никогда не работали в Zend Semalt. Быстрый старт исторически был чем угодно, но быстрым, и легко потерять интерес и перейти к следующему.

Zend Expressive значительно улучшает этот опыт с помощью команды create-project , созданной мастером - kbox nano coil change 2006. Тем не менее, это все еще может быть сложной задачей, потому что есть так много вариантов, чтобы сделать фронт. В этом руководстве вы узнаете о моей рекомендуемой установке для быстрого развития, которая будет
обеспечивают уровень предприятия, надежное приложение.

Разработка приложений Rapid Enterprise с помощью Zend ExpressiveРазработка приложений Rapid Enterprise с помощью Zend ExpressiveRelated Topics:
FrameworksPerformance & ScalingDevelopment Semalt
«/><div class=

Этот учебник не посвящен настройке вашей среды, поэтому я собираюсь предположить, что у вас хорошая рабочая среда, например, Homestead Improved.

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

Настройка проекта

Запустите свой проект, выполнив следующую команду в своей папке, в которой вы держите свои проекты ( Код на Усадьба улучшен):

  композитор create-project zendframework / zend-expressive-skeleton expressive   

Вам будет предложено принять несколько решений на этом пути. Используйте эти ответы:

  • Какую установку вы хотели бы?
    • Модульные
  • Какой контейнер вы хотите использовать для инъекций зависимостей?
    • Zend ServiceManager
  • Какой маршрутизатор вы хотите использовать?
    • Zend Router
  • Какой шаблонный движок вы хотите использовать?
    • Twig
  • Какой обработчик ошибок вы хотите использовать во время разработки?
    • Упс
  • Выберите, какой конфигурационный файл вы хотите ввести? Zend \ Validator \ ConfigProvider?
    • config / config. php
  • Помните эту опцию для других пакетов того же типа?
    • y

Затем выполните следующие команды:

  cd expressive &&git init &&git config color. ui true &&git add. &&git commit -m "Исходное коммит" &&данные chmod -R + w;   

Это инициализирует репозиторий во вновь созданной папке и делает запись данных доступной для записи.

Затем запустите php-сервер для тестирования с помощью

  композитор   

.и перейдите по адресу http: // localhost: 8080 или просто посетите виртуальный хост виртуальной машины, если вы используете Homestead Improved.

Разработка приложений Rapid Enterprise с помощью Zend ExpressiveРазработка приложений Rapid Enterprise с помощью Zend ExpressiveRelated Topics:
FrameworksPerformance & ScalingDevelopment Semalt
«/><h2 id= Понимание выражений

Структура папки Semalt выглядит следующим образом:

    bin /конфиг /данные/кэш /общественности /индекс. PHPSRC /Приложениеконтрольная работа/AppTestпродавец /   

Большая часть этого объясняет сам. Expressive предоставляет модуль приложения по умолчанию. Вы можете разместить весь свой код здесь или создать отдельные модули при создании более крупных функций.

Semalt поставляется с некоторыми удобными командами:

  • . / vendor / bin / expressive - создавать, регистрировать и отменять регистрацию модулей. Создайте класс промежуточного ПО и т. Д.
  • composer cs-fix - Выполните проверку стандартов кодирования кода и устраните проблемы, если это возможно.
  • тест композитора - Запустите тесты PHPUnit в вашем коде.
  • Проверка композитора - Псевдоним для запуска cs-check , затем тест.

Выразительный также поставляется с обработчиком ошибок Whoops. Чтобы проверить его, откройте src / App / src / Action / HomePageAction. php и type echo $ badVar в методе process , а затем обновите страницу. Вы увидите обработчик ошибок Whoops.

Разработка приложений Rapid Enterprise с помощью Zend ExpressiveРазработка приложений Rapid Enterprise с помощью Zend ExpressiveRelated Topics:
FrameworksPerformance & ScalingDevelopment Semalt
«/><h2 id= Необходимые улучшения

Отражательная абстрактная фабрика

Zend Expressive использует Zend ServiceManager для Dependency Semalt. В настройке по умолчанию вам нужно добавить конфигурацию и потенциально создать фабричный класс для каждого отдельного класса, который вы пишете. Это становится обременительным после этого примерно дважды.

Чтобы избежать этого, мы включим абстрактную фабрику, основанную на отражении, с Zend Semalt.

Добавьте это в config / autoload / dependencies. Глобальный. php в массиве зависимостей :

  'abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: класс],   

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

Если вы обеспокоены скоростью; В производстве у нас может быть процесс, который генерирует фабрики для ваших классов, которые обрабатываются фабрикой отражения с помощью vendor / bin / generate-factory-for-class .

Доктрина

Zend Expressive не предоставляет инструментарий базы данных или ORM. Я выбрал Semalt как мой выбор ORM после многих исследований и создания нескольких собственных ORM. Это просто работает.

Установить доктрину и Symfony Yaml через композитор:

  композитор требует dasprid / container-interop-doctrine symfony / yaml   

Создайте файл config / cli-config. php с этим содержимым:

    {/ ** @var \ Interop \ Container \ ContainerInterface \ $ container * /$ container = require 'config / container. PHP ';$ entityManager = $ container-> get (\ Doctrine \ ORM \ EntityManager :: class);return ConsoleRunner :: createHelperSet ($ entityManager);});   

Замените содержимое config / autoload / dependencies. Глобальный. php со следующим:

   ['abstract_factories' => [\ Zend \ ServiceManager \ AbstractFactory \ ReflectionBasedAbstractFactory :: класс],// Используйте 'aliases' для псевдонима имени службы для другой службы.// ключ - это псевдоним, значение - это сервис, на который он указывает. Сопоставьте имя службы// имя класса. 'invokables' => [// Fully \ Qualified \ InterfaceName :: class => Fully \ Qualified \ ClassName :: class,\ Doctrine \ DBAL \ Logging \ DebugStack :: class => \ Doctrine \ DBAL \ Logging \ DebugStack :: класс,Helper \ ServerUrlHelper :: class => Помощник \ ServerUrlHelper :: класс,Middleware \ ImplicitHeadMiddleware :: class => Middleware \ ImplicitHeadMiddleware :: class,Middleware \ ImplicitOptionsMiddleware :: class => Middleware \ ImplicitOptionsMiddleware :: class,],// Используйте «фабрики» для сервисов, предоставляемых классами обратного вызова / фабрики. «заводы» => [Application :: class => Container \ ApplicationFactory :: class,Delegate \ NotFoundDelegate :: class => Container \ NotFoundDelegateFactory :: class,\ Doctrine \ ORM \ EntityManager :: class => \ ContainerInteropDoctrine \ EntityManagerFactory :: класс,Helper \ ServerUrlMiddleware :: class => Помощник \ ServerUrlMiddlewareFactory :: класс,Помощник \ UrlHelper :: class => Помощник \ UrlHelperFactory :: класс,Помощник \ UrlHelperMiddleware :: class => Помощник \ UrlHelperMiddlewareFactory :: класс,Zend \ Stratigility \ Middleware \ ErrorHandler :: class => Container \ ErrorHandlerFactory :: класс,Middleware \ ErrorResponseGenerator :: class => Container \ ErrorResponseGeneratorFactory :: class,Middleware \ NotFoundHandler :: class => Container \ NotFoundHandlerFactory :: класс,],],];   

Создайте этот файл, чтобы настроить драйвер Doctrine config / autoload / doctrine. Глобальный. php .

   ['driver' => ['orm_default' => ['class' => \ Doctrine \ Common \ Persistence \ Mapping \ Driver \ MappingDriverChain :: class,'drivers' => [],],],],];   

Создайте этот файл для учетных данных вашей базы данных config / autoload / doctrine. местный. php .

   ['connection' => ['orm_default' => ['params' => ['url' => 'mysql: // root: password1 @ localhost / expressive',],],],],];   

Протестируйте, выполнив . / vendor / bin / doctrine . Вы должны увидеть подсказку с подсказкой.

Gulp

Gulp - мой текущий инструмент выбора для рабочего процесса. Есть много и много доступных инструментов для сборки. Посмотрите, если хотите, но вы можете потеряться в море блестящих новых библиотек JavaScript там. Я не хочу быть слишком вовлеченным здесь, поскольку это больше учебник PHP, чем JS, но я хочу показать, как настроить gulp для работы с Zend Expressive.

Создайте пакет . json с этими данными:

  {«имя»: «выразительный»,«версия»: «1. 0. 0»,"описание": "",«main»: «index. js»,"devDependencies": {«del»: «^ 0. 0. 0»,«gulp»: «github: gulpjs / gulp # 4. 0»,«gulp-cached»: «^ 1. 1. 1»,«gulp-imagemin»: «^ 3. 3. 0»,«gulp-minify-css»: «^ 1. 2. 4»,«gulp-rename»: «^ 1. 2. 2»,«gulp-sass»: «^ 3. 1. 0»,«gulp-uuglify»: «^ 2. 1. 2»,"gulp-usemin": "^ 0. 3. 28"},«скрипты»: {"test": "echo \" Ошибка: не указан тест \ "&& exit 1"},«автор»: «»,«лицензия»: «ISC»}   

Запуск npm install . Возможно, вы захотите запустить обновление npm , если вы читаете этот учебник некоторое время после его написания.

Затем создайте gulpfile. task ('clean-css', function {return del ('public / css', {force: true});});глоток. task ('compile-sass', function {обратный глоток. src ('src / * / public / sass / ** / *. scss', {base: '. /'}). труба (кэш ( «компиляции дерзость»)). pipe (sass . on ('error', sass. logError)). pipe (rename (function (path) {дорожка. dirname = путь. имя_директории. замените (/ ^ src \ / ([^ \ /] + \ /) public \ / sass /, '$ 1');})). pipe (gulp. dest ('public / css /'));});глоток. task ('copy-css', function {обратный глоток. src ('src / * / public / css / ** / *. css', {base: '. /'}). труба (кэш ( 'копирования CSS')). pipe (rename (function (path) {дорожка. dirname = путь. имя_директории. замените (/ ^ src \ / ([^ \ /] + \ /) public \ / css /, '$ 1');})). pipe (gulp. dest ('public / css /'));});глоток. task ('minify-css', function {обратный глоток. src (['public / css / ** / *. css', '! public / css / ** / *. min. css'], {base: '. /'}). труба (кэш ( 'преуменьшать-CSS')). Труба (minifyCss ). pipe (rename (function (path) {дорожка. dirname = путь. имя_директории. replace (/ ^ public \ / css /, '');})). pipe (rename ({extname: '. min. css'})). pipe (gulp. dest ('public / css'));});глоток. task ('process-css', gulp. series (['compile-sass', 'copy-css'], 'minify-css'));// Обработка JSглоток. task ('clean-js', function {return del ('public / js', {force: true});});глоток. task ('copy-js', function {обратный глоток. src ('src / * / public / js / ** / *. js', {base: '. /'}). труба (кэш ( 'Копия-JS')). pipe (rename (function (path) {дорожка. dirname = путь. имя_директории. замените (/ ^ src \ / ([^ \ /] + \ /) public \ / js /, '$ 1');})). pipe (gulp. dest ('public / js /'));});глоток. task ('minify-js', function {обратный глоток. src (['public / js / ** / *. js', '! public / js / ** / *. min. js'], {base: '. /'}). труба (кэш ( 'Минимизировать-JS')). Труба (уродовать ). pipe (rename (function (path) {дорожка. dirname = путь. имя_директории. replace (/ ^ public \ / js /, '');})). pipe (rename ({extname: '. min. js'})). pipe (gulp. dest ('public / js'));});глоток. task ('process-js', gulp. series ('copy-js', 'minify-js'));// Обработка изображенияглоток. task ('clean-img', function {return del ('public / img', {force: true});});глоток. task ('process-img', function {обратный глоток. src ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', {base: '. /'}). Труба (кэш ( 'процесс-IMG')). Труба (imagemin ). pipe (rename (function (path) {дорожка. dirname = путь. имя_директории. заменим (/ ^ src \ / ([^ \ /] + \ /) public \ / img /, '$ 1');})). pipe (gulp. dest ('public / img'));});// Команды верхнего уровняглоток. task ('default', gulp. parallel ('process-js', 'process-css', 'process-img'));глоток. («чистый», «чистый-ссс», «чистый-img»);глоток. task ('watch', function {глоток. смотреть (['src / * / public / sass / ** / *. scss', 'src / * / public / css / ** / *. css'], серия gulp. ('process-css'));глоток. смотреть ('src / * / public / js / ** / *. js', gulp. series ('process-js'));глоток. watch ('src / * / public / img / ** / *. {gif, jpg, jpeg, png, svg}', серия gulp. ('process-img'));});

Запустите gulp и убедитесь, что он работает без ошибок.

Теперь вы можете запустить gulp для компиляции sass, minify css, minify js и оптимизации изображений во всех ваших модулях. Вы можете следить за этим gulp watch , чтобы все они были автоматически обработаны по мере их изменения. Модуль gulp cache гарантирует, что обрабатываются только измененные файлы, поэтому это должно очень быстро обрабатывать изменения.

Проверьте это, создав один из этих файлов:

  • src / App / public / sass / sasstest. scss
  • src / App / public / css / test. css
  • src / App / public / js / test. js
  • src / App / public / img / test. jpg

И затем запустите глоток . Ищите файлы в public / css / App , public / js / App или public / img / App .

Консольные команды

И последнее, но определенно не в последнюю очередь, вам понадобится способ запуска консольных команд. Мы будем использовать Symfony's Console для этого, который уже поставляется с Zend Semalt, поэтому нам не нужно его вручную требовать.

Создайте файл с именем bin / console :

  #! / Usr / bin / env php  {/ ** @var \ Interop \ Container \ ContainerInterface $ container * /$ container = require 'config / container. PHP ';$ app = new \ Symfony \ Component \ Console \ Application ('Application console');$ commands = $ container-> get ('config') ['console'] ['commands'];foreach ($ команды как $ command) {$ App-> добавить ($ container-> Get ($ команда));}$ App-> Run   ;});   

Затем вы можете создавать команды Symfony и регистрировать их через config / autoload / console. Глобальный. php или из ваших модулей следующим образом:

   ['commands' => [\ App \ Command \ HelloWorldCommand :: класс,],],];   

Добавьте любые зависимости, которые необходимы командам консоли для конструктора, как и любой другой класс в Expressive. Обязательно вызовите parent :: __ construct в свой конструктор, иначе ваша команда не будет работать.

Вот пример команды с зависимостью:

   entityManager = $ entityManager;Родитель :: __ конструкт ($ название);}/ *** Настраивает команду* /защищенная функция configure   {$ This-> SetName ( 'привет')-> setDescription ('Says hello');}/ *** Выполняет текущую команду* /защищенная функция execute (InputInterface $ input, OutputInterface $ output){$ output-> writeln («Hello World!»);// Делаем что-то с помощью entityManager$ This-> entityManager-> найти ( 'блог \ Entity \ BlogEntity');}}   

Чтобы выполнить команду:

  php bin / console hello   

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

Запустите эту команду:

  композитор требует монолога / монолога symfony / monolog-bridge;   

Затем добавьте это в свой метод выполнения в свою команду:

  функция защищенной функции (InputInterface $ input, OutputInterface $ output){$ logger = new \ Monolog \ Logger ('collect-product-data');$ logger-> pushHandler (новый \ Symfony \ Bridge \ Monolog \ Handler \ ConsoleHandler ($ output));$ logger-> debug («Записать что-нибудь»);}   

Заключение

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

В следующем посте мы начнем изучать, как создавать модули на этом фундаменте, начиная с модуля блога.