php artisan vendor publish
Laravel Framework Russian Community
Введение
С другой стороны, некоторые пакеты разработаны специально для использования в Laravel. Они могли содержать роуты, контроллеры, шаблоны, настройки и миграции. Так как для разработки самостоятельных пакетов нет особенных правил, этот раздел документации в основном посвящён разработке именно пакетов для Laravel.
Все пакеты Laravel распространяются через Packagist и Composer, поэтому нужно изучить эти прекрасные средства распространения кода для PHP.
Файлы шаблонов (views)
Структура вашего пакета зависит от вас. Обычно пакет имеет в составе один или несколько сервис-провайдеров. Сервис-провайдеры содержат регистрацию классов в IoC и определяют, где находятся конфиги, шаблоны (views) и локализационные файлы пакета.
Шаблоны
К шаблонам пакета можно обращаться через так называемую неймспейс-конструкцию :: :
Вам нужно зарегистрить неймспейс шаблонов, указав, где находится папка шаблонов пакета. Делается это в методе boot() сервис-провайдера. Например, так регистрируется неймспейс courier
Теперь вы можете использовать в контроллере или роуте шаблон пакета таким образом:
Публикация шаблонов для изменения
Примечание: Вы можете использовать publishes не только для шаблонов, но и для любых других файлов, которые хотите скопировать из пакета в основное приложение пользователя.
Файлы переводов
Файлы локализации пакета доступны при помощи неймспейс-доступа :: :
Чтобы зарегистрировать этот неймспейс, воспользуйтесь методом loadTranslationsFrom в boot сервис-провайдера пакета. Например, для неймспейcа courier :
Файлы конфигов
Как правило, при установке пакета необходимо, чтобы пользователь мог перенести файлы конфигов к себе в приложение, чтобы иметь возможность менять там настройки. Для организации этой возможности воспользуйтесь методом publishes в boot сервис-провайдера пакета:
Доступ к конфигу осуществляется штатным образом, без неймспейс-нотации:
Публикация групп файлов
ВЫ можете разделить файлы, которые можно публиковать в приложение, на группы, и публиковать их раздельно. Например, в пакете есть конфиг и миграции:
Тепрь пользователь может опубликовать у себя, например, только конфиг:
Файлы маршрутов
Чтобы добавить в приложение маршруты пакета, подключите файл с ними в методе boot сервис-провайдера пакета:
php artisan vendor:publish not publishing any files #39
Comments
sjeswinder commented Apr 27, 2016
HI
I created a new laravel project and installed aimeos using steps from documentation. Post composer update no fioles are published to config folder.
1.4″, «mockery/mockery»: «0.9.*», «phpunit/phpunit»: «
Following is the output from composer update
The text was updated successfully, but these errors were encountered:
We are unable to convert the task to an issue at this time. Please try again.
The issue was successfully created but we are unable to update the comment at this time.
aimeos commented Apr 27, 2016
Then you’ve probably forgotten to add the service provider line in config/app.php
sjeswinder commented Apr 27, 2016
If i refer to documentation there it asks to add service provider post running
aimeos commented Apr 27, 2016
After you’ve added the service provider, there are four «artisan» command which you have to execute. The first one will publish the files.
sjeswinder commented Apr 27, 2016
I think there can be a small change in docs mentioning this. Hope you got what i want to say.
aimeos commented Apr 27, 2016
There was a problem when you do it before. That led to an exception as far as I remember.
sjeswinder commented Apr 27, 2016
Anyways my issue is resolved. Hope you can modify the documentation marking users to add service provider and then run command to publish the file.
aimeos commented Apr 27, 2016
This is already the case. php artisan vendor:publish is among the last commands to be executed and in the documentation after adding the service provider class.
Laravel Framework Russian Community
Введение
С другой стороны, некоторые пакеты разработаны специально для использования в Laravel. Они могли содержать роуты, контроллеры, шаблоны, настройки и миграции. Так как для разработки самостоятельных пакетов нет особенных правил, этот раздел документации в основном посвящён разработке именно пакетов для Laravel.
Все пакеты Laravel распространяются через Packagist и Composer, поэтому нужно изучить эти прекрасные средства распространения кода для PHP.
Файлы шаблонов (views)
Структура вашего пакета зависит от вас. Обычно пакет имеет в составе один или несколько сервис-провайдеров. Сервис-провайдеры содержат регистрацию классов в IoC и определяют, где находятся конфиги, шаблоны (views) и локализационные файлы пакета.
Шаблоны
К шаблонам пакета можно обращаться через так называемую неймспейс-конструкцию :: :
Вам нужно зарегистрить неймспейс шаблонов, указав, где находится папка шаблонов пакета. Делается это в методе boot() сервис-провайдера. Например, так регистрируется неймспейс courier
Теперь вы можете использовать в контроллере или роуте шаблон пакета таким образом:
Публикация шаблонов для изменения
Примечание: Вы можете использовать publishes не только для шаблонов, но и для любых других файлов, которые хотите скопировать из пакета в основное приложение пользователя.
Файлы переводов
Файлы локализации пакета доступны при помощи неймспейс-доступа :: :
Чтобы зарегистрировать этот неймспейс, воспользуйтесь методом loadTranslationsFrom в boot сервис-провайдера пакета. Например, для неймспейcа courier :
Файлы конфигов
Как правило, при установке пакета необходимо, чтобы пользователь мог перенести файлы конфигов к себе в приложение, чтобы иметь возможность менять там настройки. Для организации этой возможности воспользуйтесь методом publishes в boot сервис-провайдера пакета:
Доступ к конфигу осуществляется штатным образом, без неймспейс-нотации:
Публикация групп файлов
ВЫ можете разделить файлы, которые можно публиковать в приложение, на группы, и публиковать их раздельно. Например, в пакете есть конфиг и миграции:
Тепрь пользователь может опубликовать у себя, например, только конфиг:
Файлы маршрутов
Чтобы добавить в приложение маршруты пакета, подключите файл с ними в методе boot сервис-провайдера пакета:
Новые функции в Laravel 5.5
Новый релиз Laravel 5.5 станет релизом долгосрочной поддержки (Long Term Support, LTS). Это значит, что он будет получать правки багов в течение 2х лет, а обновления безопасности — в течение 3х. Таким же был релиз Laravel 5.1, но его двухгодичный срок правок подходит к концу в этом году. Давайте посмотрим без лишней суеты, что нас ждет в новой версии.
Создаем новый проект на Laravel 5.5
Поскольку новый релиз еще не выпущен официально, мы можем пока скачать dev-релиз при помощи следующей команды:
Если вы не любите Laravel installer, можете воспользоваться командой composer:
Когда мы зайдем на домашнюю страницу нового приложения, мы должны будем увидеть welcome page, аналогичную той, что была в предыдущих версиях Laravel.
Рендерим Mailables в браузере
Мне кажется, эта фича будет очень полезной. В предыдущих версиях Laravel нам приходилось слать реальные письма или пользоваться email-клиентом вроде Mailtrap, чтобы протестировать рассылку, и задачка это была не самая веселая. Больше не надо страдать, в Laravel 5.5 теперь можно отрендерить шаблон письма прямо в браузере.
Вот быстрый способ, как это сделать: создаем новый mailable и шаблон письма для нашего проекта:
Я предпочитаю использовать формат markdown, поскольку мы получаем шаблон уже с каким-то контентом. Открываем файл web.php и создаем тестовый route, чтобы проверить шаблон письма:
Если мы зайдем в route /email, то мы сможем увидеть шаблон письма:
На самом деле происходит следующее. В Laravel 5.5 класс ‘Mailable’ использует контракт ‘Renderable’ с методом ‘render()’. Вот реализация метода render в ‘Illuminate/Mail/Mailable.php’:
С помощью этого метода можно получить view. Если бы мы попытались вернуть экземпляр класса, который не применяет контракт ‘Renderable’ внутри наших route’ов, то мы бы получили ‘UnexpectedValueException’.
Кастомное оформление писем
Если использовать Markdown для оформления писем, то Laravel поставит дефолтную тему. Впрочем, кому-то могут потребоваться собственные стили, чтобы продвигать свой бренд.
Чтобы сделать кастомное оформление для конкретного mailable, сначала создаем кастомный файл ‘.css’ с нужными нам стилями:
Затем указываем имя этого файла в качестве характеристики класса Mailable:
Вспомогательные функции исключений
Посмотрим, как можно применять эти исключения:
Если использовать вспомогательную функцию ‘throw_if’, исключение будет выброшено при условии, что первый аргумент будет расценен как true.
Не лучший пример, но для демонстрации подойдет.
Команда migrate:fresh
Но у вас, возможно, пару раз случались проблемы с этой командой, особенно при работе с ограничениями внешнего ключа (foreign key constraints) или когда один из ‘down()’ методов в какой-либо из ваших миграций не был определен в достаточной мере. Когда такое происходит, мы в большинстве случаев вручную избавляемся от таблицы, с которой возникают проблемы — (возможно, используя CLI или какой-нибудь GUI). Вот именно тогда команда migrate:fresh спешит на помощь. Эта команда удаляет все таблицы, а затем снова запускает существующие миграции:
Stack Trace ошибок в формате JSON
Не самое большое изменение, но в предыдущих версиях Laravel мы видели HTML-разметку от клиента API вроде Postman каждый раз, когда возникала ошибка в наших API. В Laravel 5.5 в случае ошибки мы получаем не HTML-разметку, а трассировку в JSON, которую легче воспринимать:
Автоматическая установка пакетов
Чтобы использовать сторонний пакет в наших проектах на Laravel, мы делаем следующее:
Как видите, процедуру можно упростить. Теперь будет следующим образом.
С автоматической установкой пакетов мы просто выбираем нужный пакет и ставим его на лету. Замечу, впрочем, что это возможно, только если поставщик пакета настроил его соответствующим образом.
Если мы посмотрим на пакет Laravel Debugbar, для которого уже настроена автоустановка, мы увидим, что внутри файла composer.json есть секция extra :
С автоустановкой, если удалить пакет через Composer, то удаляется также все, что связано с этим пакетом.
Изменения в команде vendor:publish
В предыдущих версиях Laravel команда vendor:publish публиковала ресурсы всех пакетов и самого фреймворка. Некоторые из этих ресурсов включают миграции, views и конфиги.
В Laravel 5.5 надо уточнять в деталях, что именно мы хотим опубликовать при помощи этой команды. Если мы запускаем команду php artisan vendor:publish без каких-либо флагов, от нас потребуется выбрать выбрать провайдера или тег, чтобы было проще опубликовать только то, что мы хотим. См. скриншот ниже:
Разнообразие front-end пресетов
В Laravel 5.3 и 5.4 у нас по умолчанию были некоторые заготовки Vue и Bootstrap, что упрощало front-end разработку. В новой версии в этот набор добавили React. Впрочем, он не стоит там по умолчанию.
Новая команда artisan помогает управлять front-end пресетами. У нас будет только та заготовка, которая нам нужна для того пресета, с которым мы хотим работать. Но не всех устраивают дефолтные пресеты, Vue, Bootstrap и React, кому-то может потребоваться что-то еще. Возможно, другой front-end фреймворк. И Laravel уже позаботился об этом:
Эта команда удалит все существующие front-end заготовки. Если бы мы захотели использовать React, следующая команда поможет нам с заготовкой:
Ниже представлена эта новая команда в действии:
Whoops вернулся!
В Laravel 5.5 вернулся Whoops! с новым способом отображения ошибок. Теперь, если при разработке есть ошибка, мы сможем увидеть эту строчку кода в виде скриншота вместе с сообщением об ошибке. На мой взгляд, сообщение об ошибке теперь выглядит лучше, а то, что мы теперь получаем скриншот с ошибочной строчкой кода, позволяет исправлять ошибки ещё проще.
Пример ошибки с Whoops:
Еще одна крутая фишка в том, что теперь Whoops позволяет открывать указанные файлы напрямую в вашем IDE или редакторе. Эта функция работает только в том случае, если у вас есть локальный доступ к PHP-файлам на той машине, на которые установлен редактор. Чтобы ее настроить, откройте app/Exceptions/Handler.php и добавьте вот этот сниппет:
Метод Report кастомных исключений
В предыдущих версиях если мы хотели настроить кастомные исключения каким-то особым образом, нам приходилось размещать их внутри метода report в файле Handler.php. Например так:
Если у нас есть, например, 50 основных исключений, то этот файлик превратится в нечто ужасное. В Laravel 5.5, для того чтобы указать, что происходит в случае кастомного исключения, можно создать report() метод внутри исключения:
Генераторы фабрик моделей
В Laravel 5.5 появилась новая команда для создания фабрики моделей. Фабрика моделей очень удобна, когда нам нужно сгенерить фейковые данные или новый объект для тестов.
Чтобы создать фабрику для конкретного класса, запускаем команду:
Теперь если мы откроем database/factories, то увидим класс PostFactory:
Возврат валидированных данных
В Laravel 5.5 теперь можно создавать объекты напрямую из валидированных данных:
Также можно вызвать команду validate прямо из request’а:
Замечу, впрочем, что нужно соблюдать осторожность, когда вы создаете объекты таким способом, поскольку любой атрибут, который вы оставите вне метода валидации, не будет иметь значения. Чтобы справиться с этой проблемой, мы передаем все атрибуты, которые мы хотим создать внутри метода валидации для данного объекта, даже если их значения не требуют никакой валидации:
Таким образом, это поле автоматически добавляется к разрешенным данным запроса, но оно не ограничивается никакими правилами валидации.
Кастомные правила валидации
Предположим, например, что мы не хотим давать никакого конкретного имени пользователю. Тогда наше правило будет выглядеть так:
Затем мы используем новое правило, чтобы валидировать атрибут username :
Как определяется кастомная валидация в новой версии Laravel, подробно описано в статье Taylor Otwell.
В коллекции добавлены DD и Dump
Теперь в коллекции включены как метод dump(), так и dd(). В предыдущих версиях Laravel, когда мы отлаживали коллекции, мы назначали переменную коллекции, а потом делали dump, поскольку коллекция изменялась. В Laravel 5.5 так больше делать не придется, поскольку мы теперь можем вызвать команду dd() или dump() прямо из коллекции, что позволяет проводить отладку намного проще.
Предположим, у нас есть коллекция постов, которые подверглись ряду изменений, и нам надо проинспектировать коллекцию на каждом шаге. Тогда делаем следующее:
На выходе получаем:
Так легче инспектировать содержание коллекции на каждом шаге. Впрочем. Замечу, что между командами dump() и dd() есть разница. dump() выдает результат на данный момент, а затем продолжает работу, тогда как dd() сразу останавливает процесс и делает dump результатов (dd означает dump and die, сбросить и умереть). Если бы мы вызывали dd() из коллекции на каждом шаге, то мы бы только получили результат в самой первой точке, когда мы вызвали dd() из коллекции. Взгляните:
366666
На выходе получим другое:
Касты в промежуточных таблицах отношений “многие-ко-многим”
Обычно бывает можно объявить свойство casts Модели, которое определяет, как атрибут должен быть сохранен и прочитан. Предположим, у нас есть модель Post, и мы хотим, чтобы одно из полей было сериализовано в JSON при чтении и записи. Следующий сниппет кода нам поможет в этом:
Кастомные директивы Blade::if()
Длинный повторяющийся код проверок в шаблонах blade может сделать их некрасивыми. Хорошая новость в том, что теперь стало возможным извлекать повторяющийся код проверок из шаблонов, что делает их более чистыми и читабельными. Проверки вроде таких:
Логика создания кастомной директивы blade добавляется в метод boot класса AppServiceProvider :
Для некоторых проверок может потребоваться передать какой-то метод аргументу. В таком случае мы передаем аргумент в замыкание, когда речь идет о кастомной директиве blade.
Затем, чтобы использовать эту новую директиву в наших шаблонах:
Авторегистрация новых команд artisan в Kernel
Больше не обязательно регистрировать новые команды в Kernel. У нас теперь есть внутри файла app/Console/kernel.php новый метод, который отслеживает директорию command и превращает все пути файлов в namespaced пути:
Предположим, что мы вызвали команду, которая еще не зарегистрирована в ядре. Метод commands() автоматически ее подключит.
Новые методы маршрутов
Это не самая крутая новая функция, но все же стоит упомянуть, что теперь у нас есть два дополнительных метода маршрутов:
Представляем Laravel Horizon
Это новый пакет Laravel, который предоставляет панель и управляемую кодом систему конфигурации для очередей Laravel Redis:
Horizon в реальном времени показывает нагрузки очередей, недавние задачи, проваленные задачи, попытки перезапуска задач, пропускную способность и рантайм метрики и количество процессов.
Среди функций Horizon есть следующие:
Taylor Otwell в своей статье подробно рассматривает, как настроить Horizon и все функции, которые в него входят.
Новый трейт миграции баз данных
Использование трейта DatabaseMigrations в тестах помогает убедиться, что миграции проводятся до и после каждого теста, а трейт DatabaseTransactions позволяет быть уверенным, что база данных восстанавливается в исходное состояние после каждого теста.
Трейт RefreshDatabase объединяет эти две функции, т.к. единожды мигрирует базу данных в начале тестов, а затем оборачивает каждый тест после этого в транзакции. Преимущество в том, что нам не надо повторно мигрировать базу данных для каждого теста, а это значит, что тесты будут проходить быстрее.
Заключение
Как видите, в новой версии будет много новых крутых фишек. Впрочем, официального релиза еще не было, так что придется подождать, пока опубликуют инструкции для обновления.
Пишите свои мысли и предложения в комментариях и не забудьте поделиться ссылкой на статью с другими разработчиками на Laravel!
Laravel 8 · Консоль Artisan
Введение
Artisan – это интерфейс командной строки, входящий в состав Laravel. Он предлагает ряд полезных команд, которые помогут при создании приложения. Для просмотра списка всех доступных команд Artisan можно использовать команду list :
Каждая команда также включает в себя экран «справки», который отображает и описывает доступные аргументы и параметры команды. Чтобы просмотреть экран справки, используйте help перед именем команды:
Laravel Sail
Если вы используете Laravel Sail в качестве локальной среды разработки, не забудьте использовать командную строку sail для вызова команд Artisan. Sail выполнит ваши команды Artisan в контейнерах Docker вашего приложения:
Tinker (REPL)
Laravel Tinker – это мощный REPL для фреймворка Laravel, основанный на пакете PsySH.
Установка
Все приложения Laravel по умолчанию включают Tinker. Однако вы можете установить Tinker с помощью Composer, если вы ранее удалили его из своего приложения:
Ищете графический интерфейс для взаимодействия с приложением Laravel? Зацените Tinkerwell!
Использование
Tinker позволяет взаимодействовать полностью со всем приложением Laravel из командной строки, включая модели Eloquent, задачи, события и многое другое. Чтобы войти в среду Tinker, выполните команду tinker Artisan:
Вы можете опубликовать конфигурационный файл Tinker с помощью команды vendor:publish :
Глобальный помощник dispatch и метод dispatch класса Dispatchable зависят от «garbage collection» для помещения задания в очередь. Следовательно, при использовании Tinker вы должны использовать Bus::dispatch или Queue::push для отправки заданий.
Список разрешенных команд
Черный список псевдонимов
Как правило, Tinker автоматически создает псевдонимы классов, когда вы взаимодействуете с ними в Tinker. Тем не менее, вы можете запретить такое поведение для некоторых классов, перечислив их в массиве dont_alias конфигурационного файла config/tinker.php :
Написание команд
В дополнение к командам Artisan, вы можете создавать пользовательские команды. Команды обычно хранятся в каталоге app/Console/Commands ; однако вы можете выбрать другое месторасположение, если эти команды могут быть загружены менеджером Composer.
Генерация команд
Чтобы сгенерировать новую команду, используйте команду make:command Artisan. Эта команда поместит новый класс команды в каталог app/Console/Commands вашего приложения. Если этот каталог не существует в вашем приложении, то Laravel предварительно создаст его:
Структура команды
Давайте рассмотрим пример команды. Обратите внимание, что мы можем запросить любые необходимые зависимости в методе handle команды. Контейнер служб Laravel автоматически внедрит все зависимости, типы которых объявлены в этом методе:
Хорошей практикой повторного использования кода считается создание «простых» консольных команд с делегированием своих задач службам приложения. В приведенном примере мы внедряем класс службы для выполнения «затратной» отправки электронных писем.
Анонимные команды
Анонимные команды обеспечивают альтернативу определению консольных команд в виде классов. Точно так же, как замыкания маршрутов являются альтернативой контроллерам. В рамках метода commands файла app/Console/Kernel.php Laravel загружает файл routes/console.php :
Этот файл не определяет маршруты HTTP, он определяет точки входа (маршруты) для консольных команд в приложении. В этом файле с помощью метода Artisan::command можно определить все анонимные консольные команды. Метод command принимает два аргумента: сигнатуру команды и замыкание, которое получает аргументы и параметры команды:
Замыкание привязано к базовому экземпляру команды, поэтому у вас есть полный доступ ко всем вспомогательным методам, к которым вы обычно можете обращаться в команде, созданной с помощью класса.
Типизация зависимостей
Помимо получения аргументов и параметров, замыкание анонимной команды также принимает дополнительные зависимости из контейнера служб, необходимые для внедрения:
Описания анонимных команд
При определении анонимных команд, можно использовать метод purpose для добавления описания команды. Это описание будет отображаться при запуске команд php artisan list и php artisan help :
Определение вводимых данных
Аргументы
Все предоставленные пользователем аргументы и параметры заключаются в фигурные скобки. В следующем примере команда определяет один обязательный аргумент user :
По желанию можно сделать аргументы необязательными или определить значения по умолчанию:
Параметры
Параметры со значениями
Давайте рассмотрим параметр, ожидающий значение. Если пользователь должен указать значение для параметра, то добавьте суффикс = к имени параметра:
В этом примере пользователь может передать значение для параметра. Если параметр не указан при вызове команды, то его значение будет null :
Параметру можно присвоить значение по умолчанию, указав его после имени. Если значение параметра не передано пользователем, то будет использовано значение по умолчанию:
Псевдонимы параметров
Чтобы назначить псевдоним при определении параметра, вы можете указать его перед именем параметра и использовать символ разделителя | для отделения псевдонима от полного имени параметра:
Массивы данных
При вызове этого метода аргументы user могут передаваться по порядку в командную строку. Например, следующая команда установит значение user как [‘foo’, ‘bar’] :
Метасимвол * можно комбинировать с необязательным определением аргумента, чтобы разрешить ноль или более экземпляров аргумента:
Параметр со множеством значений
При определении параметра, ожидающего множество значений, каждое значение передаваемого команде параметра должно иметь префикс с именем параметра:
Описания вводимых данных
Вы можете назначить описания входным аргументам и параметрам, отделив имя аргумента от описания с помощью двоеточия. Если вам нужно немного больше места для определения вашей команды, то распределите определение на несколько строк:
Ввод/вывод команды
Получение входных данных
Если вам нужно получить все аргументы в виде массива, вызовите метод arguments :
Запрос для ввода данных
Помимо отображения вывода, вы можете попросить пользователя предоставить данные во время выполнения вашей команды. Метод ask отобразит пользователю указанный вопрос, примет его ввод, а затем вернет эти данные, полученные от пользователя, обратно в команду:
Запрос подтверждения
Автозавершение
Метод anticipate используется для автоматического завершения возможных вариантов. Пользователь по-прежнему может дать любой ответ, независимо от подсказок автозавершения:
Вопросы с множественным выбором
Кроме того, метод choice принимает необязательные четвертый и пятый аргументы для определения максимального количества попыток выбора действительного ответа и того, разрешен ли множественный выбор:
Вывод данных
Вы можете использовать метод line для отображения простого неокрашенного текста:
Вы можете использовать метод newLine для отображения пустой строки:
Таблицы
Метод table упрощает корректное форматирование нескольких строк / столбцов данных. Все, что вам нужно сделать, это указать имена столбцов и данные для таблицы, и Laravel автоматически рассчитает подходящую ширину и высоту таблицы:
Индикаторы выполнения
Иногда может потребоваться больший контроль над продвижением индикатора выполнения. Сначала определите общее количество шагов, через которые будет проходить процесс. Затем продвигайте индикатор выполнения после обработки каждого элемента:
Регистрация команд
Программное выполнение команд
Кроме того, вы можете передать методу call команду полностью в виде строки:
Передача массива значений
Если ваша команда определяет параметр, который принимает массив, то вы можете передать массив значений этому параметру:
Передача значений логического типа
Очереди команд Artisan
Вызов команд из других команд
Настройка заготовок
Опубликованные заготовки будут расположены в каталоге stubs корня вашего приложения. Любые изменения, внесенные вами в эти заготовки, будут учтены при создании соответствующих классов с помощью команд make Artisan.