php artisan make service
Команды Artisan Make с параметрами
В Laravel есть потрясающий набор artisan команд, из которых чаще всего используется make:xxx — например, make:model или make:migration и т. Д. Но знаете ли вы их все? Знаете ли их параметры, которые могут помочь сделать код еще быстрее?
Во-первых, есть команда php artisan list, которая выдаст нам все команды:
Но это не даст нам никакой информации о параметрах и опциях этих команд. Я расскажу вам об этом подробно, начиная с наиболее используемых.
Для этого мы углубимся в код фреймворка, находящийся в папке /vendor/laravel/framework/src/Illuminate, и проверим, какие опции и недокументированные функции есть у этих команд.
1. make:controller
Эта команда создает новый файл контроллера в папке app/Http/Controllers.
—resource
Контроллер будет содержать методы для каждой из доступных операций с ресурсами — index(), create(), store(), show(), edit(), update(), destroy().
—model=Photo
Если нужно, чтобы методы контроллера указывали на экземпляр модели.
—parent=Photo
Недокументированный параметр, в коде написано «Генерирует вложенный класс контроллера ресурсов», но мне не удалось сгенерировать контроллер таким образом. Вероятно, работа над этим параметром еще в процессе.
2. make:model
Создает новый класс Eloquent модели.
—migration
Создает новый файл миграции для модели.
—controller
Создает новый контроллер для модели.
—resource
Указывает, что сгенерированный контроллер должен контроллером ресурсов.
Да, вы правильно поняли, вы можете сделать так:
3. make:migration
Создает новый файл миграции.
—create=Table
Таблица, которая будет создана.
—table=Table
Таблица для миграции.
—path=Path
Место, где будет создан файл миграции.
4. make:seeder
Создает новый класс наполнения базы данных.
5. make:request
Создает новый класс валидации форм в папке app/Http/Requests.
6. make:middleware
Создает новый класс посредника.
7. make:policy
Создает новый класс политики.
—model=Photo
Модель, к которой применяется политика.
8. make:auth
Шаблоны и маршруты для логина и регистрации.
—views
Только шаблоны аутентификации.
—force
Перезаписать существующие шаблоны по умолчанию.
9. make:command
Создает новую команду Artisan.
—command=Command
Назначаем терминальную команду.
10. make:event
Создает новый класс событий.
11. make:job
Создает новый класс отложенных задач
—sync
Задача должна быть синхронной.
12. make:listener
Создает новый класс слушателя событий
—event=Event
Класс, который будет прослушиваться.
—queued
Указывает, что слушатель должен быть поставлен в очередь.
13. make:mail
Создает новый почтовый класс.
—markdown
Создает новый Markdown-шаблон для писем
14. make:notification
Создает новый класс уведомлений.
—markdown
Создает новый Markdown-шаблон для уведомлений.
15. make:provider
Создает новый класс провайдера
16. make:test
Создает новый класс тестирования.
—unit
Создает модуль теста.
Наш Телеграм-канал — следите за новостями о Laravel.
Задать вопросы по урокам можно на нашем форуме.
Artisan Console
Introduction
Artisan is the command line interface included with Laravel. Artisan exists at the root of your application as the artisan script and provides a number of helpful commands that can assist you while you build your application. To view a list of all available Artisan commands, you may use the list command:
Every command also includes a «help» screen which displays and describes the command’s available arguments and options. To view a help screen, precede the name of the command with help :
Laravel Sail
If you are using Laravel Sail as your local development environment, remember to use the sail command line to invoke Artisan commands. Sail will execute your Artisan commands within your application’s Docker containers:
Tinker (REPL)
Laravel Tinker is a powerful REPL for the Laravel framework, powered by the PsySH package.
Installation
All Laravel applications include Tinker by default. However, you may install Tinker using Composer if you have previously removed it from your application:
Looking for a graphical UI for interacting with your Laravel application? Check out Tinkerwell!
Usage
Tinker allows you to interact with your entire Laravel application on the command line, including your Eloquent models, jobs, events, and more. To enter the Tinker environment, run the tinker Artisan command:
You can publish Tinker’s configuration file using the vendor:publish command:
The dispatch helper function and dispatch method on the Dispatchable class depends on garbage collection to place the job on the queue. Therefore, when using tinker, you should use Bus::dispatch or Queue::push to dispatch jobs.
Command Allow List
Classes That Should Not Be Aliased
Typically, Tinker automatically aliases classes as you interact with them in Tinker. However, you may wish to never alias some classes. You may accomplish this by listing the classes in the dont_alias array of your tinker.php configuration file:
Writing Commands
In addition to the commands provided with Artisan, you may build your own custom commands. Commands are typically stored in the app/Console/Commands directory; however, you are free to choose your own storage location as long as your commands can be loaded by Composer.
Generating Commands
Command Structure
After generating your command, you should define appropriate values for the signature and description properties of the class. These properties will be used when displaying your command on the list screen. The signature property also allows you to define your command’s input expectations. The handle method will be called when your command is executed. You may place your command logic in this method.
Let’s take a look at an example command. Note that we are able to request any dependencies we need via the command’s handle method. The Laravel service container will automatically inject all dependencies that are type-hinted in this method’s signature:
For greater code reuse, it is good practice to keep your console commands light and let them defer to application services to accomplish their tasks. In the example above, note that we inject a service class to do the «heavy lifting» of sending the e-mails.
Closure Commands
Closure based commands provide an alternative to defining console commands as classes. In the same way that route closures are an alternative to controllers, think of command closures as an alternative to command classes. Within the commands method of your app/Console/Kernel.php file, Laravel loads the routes/console.php file:
Even though this file does not define HTTP routes, it defines console based entry points (routes) into your application. Within this file, you may define all of your closure based console commands using the Artisan::command method. The command method accepts two arguments: the command signature and a closure which receives the command’s arguments and options:
The closure is bound to the underlying command instance, so you have full access to all of the helper methods you would typically be able to access on a full command class.
Type-Hinting Dependencies
In addition to receiving your command’s arguments and options, command closures may also type-hint additional dependencies that you would like resolved out of the service container:
Closure Command Descriptions
When defining a closure based command, you may use the purpose method to add a description to the command. This description will be displayed when you run the php artisan list or php artisan help commands:
Defining Input Expectations
When writing console commands, it is common to gather input from the user through arguments or options. Laravel makes it very convenient to define the input you expect from the user using the signature property on your commands. The signature property allows you to define the name, arguments, and options for the command in a single, expressive, route-like syntax.
Arguments
All user supplied arguments and options are wrapped in curly braces. In the following example, the command defines one required argument: user :
You may also make arguments optional or define default values for arguments:
Options
Options With Values
Next, let’s take a look at an option that expects a value. If the user must specify a value for an option, you should suffix the option name with a = sign:
In this example, the user may pass a value for the option like so. If the option is not specified when invoking the command, its value will be null :
You may assign default values to options by specifying the default value after the option name. If no option value is passed by the user, the default value will be used:
Option Shortcuts
To assign a shortcut when defining an option, you may specify it before the option name and use the | character as a delimiter to separate the shortcut from the full option name:
Input Arrays
If you would like to define arguments or options to expect multiple input values, you may use the * character. First, let’s take a look at an example that specifies such an argument:
When calling this method, the user arguments may be passed in order to the command line. For example, the following command will set the value of user to an array with foo and bar as its values:
This * character can be combined with an optional argument definition to allow zero or more instances of an argument:
Option Arrays
When defining an option that expects multiple input values, each option value passed to the command should be prefixed with the option name:
Input Descriptions
You may assign descriptions to input arguments and options by separating the argument name from the description using a colon. If you need a little extra room to define your command, feel free to spread the definition across multiple lines:
Command I/O
Retrieving Input
While your command is executing, you will likely need to access the values for the arguments and options accepted by your command. To do so, you may use the argument and option methods. If an argument or option does not exist, null will be returned:
Options may be retrieved just as easily as arguments using the option method. To retrieve all of the options as an array, call the options method:
Prompting For Input
In addition to displaying output, you may also ask the user to provide input during the execution of your command. The ask method will prompt the user with the given question, accept their input, and then return the user’s input back to your command:
Asking For Confirmation
If necessary, you may specify that the confirmation prompt should return true by default by passing true as the second argument to the confirm method:
Auto-Completion
The anticipate method can be used to provide auto-completion for possible choices. The user can still provide any answer, regardless of the auto-completion hints:
Alternatively, you may pass a closure as the second argument to the anticipate method. The closure will be called each time the user types an input character. The closure should accept a string parameter containing the user’s input so far, and return an array of options for auto-completion:
Multiple Choice Questions
If you need to give the user a predefined set of choices when asking a question, you may use the choice method. You may set the array index of the default value to be returned if no option is chosen by passing the index as the third argument to the method:
In addition, the choice method accepts optional fourth and fifth arguments for determining the maximum number of attempts to select a valid response and whether multiple selections are permitted:
Writing Output
To display an error message, use the error method. Error message text is typically displayed in red:
You may use the line method to display plain, uncolored text:
You may use the newLine method to display a blank line:
Tables
The table method makes it easy to correctly format multiple rows / columns of data. All you need to do is provide the column names and the data for the table and Laravel will automatically calculate the appropriate width and height of the table for you:
Progress Bars
For long running tasks, it can be helpful to show a progress bar that informs users how complete the task is. Using the withProgressBar method, Laravel will display a progress bar and advance its progress for each iteration over a given iterable value:
Sometimes, you may need more manual control over how a progress bar is advanced. First, define the total number of steps the process will iterate through. Then, advance the progress bar after processing each item:
Registering Commands
All of your console commands are registered within your application’s App\Console\Kernel class, which is your application’s «console kernel». Within the commands method of this class, you will see a call to the kernel’s load method. The load method will scan the app/Console/Commands directory and automatically register each command it contains with Artisan. You are even free to make additional calls to the load method to scan other directories for Artisan commands:
Programmatically Executing Commands
Sometimes you may wish to execute an Artisan command outside of the CLI. For example, you may wish to execute an Artisan command from a route or controller. You may use the call method on the Artisan facade to accomplish this. The call method accepts either the command’s signature name or class name as its first argument, and an array of command parameters as the second argument. The exit code will be returned:
Alternatively, you may pass the entire Artisan command to the call method as a string:
Passing Array Values
If your command defines an option that accepts an array, you may pass an array of values to that option:
Passing Boolean Values
Queueing Artisan Commands
Using the queue method on the Artisan facade, you may even queue Artisan commands so they are processed in the background by your queue workers. Before using this method, make sure you have configured your queue and are running a queue listener:
Using the onConnection and onQueue methods, you may specify the connection or queue the Artisan command should be dispatched to:
Calling Commands From Other Commands
Sometimes you may wish to call other commands from an existing Artisan command. You may do so using the call method. This call method accepts the command name and an array of command arguments / options:
If you would like to call another console command and suppress all of its output, you may use the callSilently method. The callSilently method has the same signature as the call method:
Signal Handling
The Symfony Console component, which powers the Artisan console, allows you to indicate which process signals (if any) your command handles. For example, you may indicate that your command handles the SIGINT and SIGTERM signals.
To get started, you should implement the Symfony\Component\Console\Command\SignalableCommandInterface interface on your Artisan command class. This interface requires you to define two methods: getSubscribedSignals and handleSignal :
As you might expect, the getSubscribedSignals method should return an array of the signals that your command can handle, while the handleSignal method receives the signal and can respond accordingly.
Stub Customization
The Artisan console’s make commands are used to create a variety of classes, such as controllers, jobs, migrations, and tests. These classes are generated using «stub» files that are populated with values based on your input. However, you may want to make small changes to files generated by Artisan. To accomplish this, you may use the stub:publish command to publish the most common stubs to your application so that you can customize them:
The published stubs will be located within a stubs directory in the root of your application. Any changes you make to these stubs will be reflected when you generate their corresponding classes using Artisan’s make commands.
Events
Использование команд консоли Artisan в Laravel
После того как мы устанавливаем Laravel на свой компьютер, нам становится доступен такой инструмент как Artisan.
Artisan – это интерфейс командной строки или CLI-приложение, который позволяет выполнять целое множество команд при разработке веб-приложения на Laravel. Таким образом, является отличным помощником веб-разработчика, который в значительной степени может сократить некоторые рутинные операции при разработке.
Файл с названием «artisan» физически находится в директории сайта Laravel, в терминале мы обращаемся к нему через php с указанием имени этого файла. Для примера, давайте рассмотрим список всех доступных команд, вызвав таким образом справку по интерфейсу.
Просмотр списка доступных команд
В результате выполнения команды в окне консоли мы увидим все доступные команды для этого инструмента.
Как вы можете заметить, команд целое множество. Однако на практике большинство из них может быть и не разу не пригодятся. Далее я решил опубликовать список команд, который могут оказаться полезными в ряде случаев.
Запуск локального сервера
Для генерации нового ключа (обычно создаётся автоматически при установке)
Создание нового файла контроллера
Будет создана папка app/Http/Cotrollers и файл с классом контроллера ContactController.php
Создание файла валидации данных
Будет создана папка app/Http/Requests/, в ней будет создан файл ContactRequest.php
Создание файла — класс модели
где Contact — имя модели, параметр -m добавляет файл миграции
Выполнение миграции базы данных
Файлы миграции базы данных располагаются в отдельной директории /database/migrations/. Эта команда запускает миграцию данных из этих файлов в базу данных.
Отмена миграции на один шаг назад
Если вы выполняли миграцию в несколько шагов, то каждый предыдущий шаг может быть отменён с помощью этой команды.
Отмена миграции на 3 шага назад
Давайте предположим, что вы выполняли команду миграции базы данных несколько раз. После чего последние три миграции по каким-то причинам стало необходимо отменить. Команда отменит последние миграции, и вернёт таблицы в базе в то состояние, как было до этих трёх миграций.
Отмена всех миграций
Выполнив эту команду, все миграции будут отменены, и таблицы в базе данных будут удалены до исходного состояния.
Очистка внутреннего кэша Laravel
Внутренний кэш предназначен для ускорения работы Laravel, создаётся он автоматически. Иногда при разработке, чтобы изменения вступили в силу, его может потребоваться очищать.
Но и в конце хотелось бы добавить пару команд npm, которые не относятся к «artisan», но часто используются при разработке. Npm – это менеджер пакетов, который входит в состав Node.js. Node.js как правило устанавливается попутно с Laravel, и выполняет ряд задач по проекту. В основном это работа с преобразованием файлов CSS и JS.
Преобразование всех файлов JS/CSS
Согласно правилам, в файле «миксе» webpack.mix.js который находится в корне сайта, будет выполнено преобразование файлов. Таким образом, внося какие-либо изменения в CSS либо JS файлы, необходимо выполнять преобразование, перед тем как изменения можно увидеть в браузере.
Автоматическое преобразование файлов JS/CSS
В предыдущем случае, команду следует запускать после каждого изменения файлов. Запуска в этом режиме, отслеживание изменений и преобразование файлов будет происходить автоматически.
Консоль Artisan
Введение
Artisan — интерфейс командной строки, который поставляется с Laravel. Он содержит набор полезных команд, помогающих вам при разработке приложения. Для просмотра списка доступных команд используйте команду sh list :
Каждая команда имеет описание, в котором указаны её доступные аргументы и ключи. Для просмотра описания просто добавьте перед командой слово sh help :
Создание команд
Генерирование команд
Затем вам надо зарегистрировать команду, тогда она сможет быть запущена через командный интерфейс Artisan.
Структура команды
Для улучшения кода, с точки зрения его повторного использования, полезно сохранять ваши консольные команды простыми и использовать в них сервисы самого приложения для выполнения их задач. Обратите внимание, что в приведённом примере мы внедряем класс сервиса для выполнения «трудоёмкой» задачи отправки писем.
Давайте посмотрим на пример команды. Мы можем внедрить любые необходимые зависимости в конструкторе команды. Сервис-контейнер Laravel автоматически внедрит все указанные в конструкторе зависимости:
Команды замыкания
Команды на основе замыканий являются альтернативой определению консольных команд в виде классов, подобно тому, как замыкания маршрутов являются альтернативой контроллерам. В методе PHP commands () файла app/Console/Kernel.php Laravel загружает файл routes/console.php :
Замыкание привязано к лежащему в основе экземпляру команды, поэтому у вас есть полный доступ ко всем вспомогательным методам, которые обычно доступны вам в полном классе команды.
Указание типов зависимостей
Помимо получения аргументов и ключей вашей команды в замыканиях команд можно указывать типы дополнительных зависимостей, которые вам необходимо получить из сервис-контейнера:
Описание команд замыканий
При определении команд на основе замыканий вы можете использовать метод PHP describe () для добавления описания команды. Это описание будет выводится при выполнении команд sh php artisan list или sh php artisan help :
Определение ожиданий ввода
При создании консольных команд часто необходимо получать ввод от пользователя через аргументы или ключи. В Laravel очень удобно определить ожидаемый от пользователя ввод, используя свойство signature вашей команды. Это свойство позволяет задать имя, аргументы и ключи для команды в едином, выразительном, маршруто-подобном синтаксисе.
Аргументы
Все вводимые пользователем аргументы и ключи заключаются в фигурные скобки. В следующем примере команда определяет один требуемый аргумент user :
Вы можете сделать аргумент необязательным и определить значения по умолчанию для аргументов:
Ключи
Ключи со значениями
Теперь посмотрим на ключи, которые ожидают значения. Необходимость ввода значения для ключа задаётся при помощи знака равно (=):
В этом примере пользователь может передать значение для ключа вот так:
Для ключей можно задать значение по умолчанию, указав его после имени ключа. Это значение будет использовано, если пользователь не укажет значение ключа:
Сокращение ключа
Чтобы задать сокращение при определении ключа, вы можете указать его перед именем ключа и отделить его символом вертикальной черты (|):
Ввод массивов
При вызове этой команды в командную строку можно передать аргументы user по порядку. Например, следующая команда установит значение user равное [‘foo’, ‘bar’] :
При определении ключа, который будет принимать на вход массив, каждое передаваемое в команду значение ключа должно иметь префикс в виде имени ключа:
Описание ввода
Вы можете задать описание для аргументов и ключей, отделив их двоеточием. Если вам необходимо немного больше места для определения вашей команды, вы можете разделить описание на несколько строк:
Ввод/вывод команд
Чтение ввода
Для чтения значения аргумента используйте метод PHP argument () :
Если вам необходимо прочитать все аргументы в виде массива, вызовите метод PHP arguments () (для версии 5.2 и ранее — метод PHP argument () без аргументов):
Запрос ввода
В дополнение к отображению вывода вы можете запросить у пользователя данные во время выполнения команды. Метод PHP ask () выведет запрос, примет введённые данные, а затем вернёт их вашей команде:
Запрос подтверждения
Автозаполнение
Метод PHP anticipate () можно использовать для предоставления пользователю возможных вариантов для выбора. Независимо от наличия этих вариантов пользователь может указать свой вариант.
Вопросы с несколькими вариантами ответов
Вывод
Для простого вывода текста в консоль без использования специальных цветов используйте метод PHP line () :
Табличный вывод
Метод PHP table () позволяет легко форматировать несколько строк/столбцов данных. Просто передайте в него заголовки и строки. Ширина и высота будет динамически определена на основе переданных данных:
Индикаторы процесса
Для продолжительных задач бывает полезно вывести индикатор процесса. Используя объект вывода мы можем запустить, передвинуть и остановить индикатор. Сначала определите общее число шагов, по которым будет идти процесс. Затем передвигайте индикатор после выполнения каждого шага:
Указание имени среды для выполнения команды
Вывод вашей текущей версии Laravel
Регистрация команд
Программное выполнение команд
С помощью метода PHP queue () можно даже поставить команды в очередь, тогда они будут обработаны в фоне с помощью ваших обработчиков очереди. Прежде чем использовать этот метод, убедитесь в том, что вы настроили вашу очередь, и что слушатель очереди запущен:
Вызов команд из других команд
Планирование команд Artisan
Данный раздел статьи актуален только для версии 5.0 и был
удален в версии 5.1.
Раньше разработчикам приходилось создавать Cron-задачи для каждой консольной команды, которую они хотели запланировать. Это утомительно. Для планирования консольных команд теперь не ведётся контроль версий, и для добавления Cron-задач вам необходимо подключаться к серверу по SSH. Давайте упростим нам жизнь. Планировщик команд Laravel позволяет вам гибко и выразительно задавать план команд в самом Laravel, а на сервере нужна только одна Cron-задача.
Эта задача будет каждую минуту вызывать планировщик команд Laravel. А тот в свою очередь будет проверять имеющиеся в плане задачи и выполнять необходимые. Проще некуда!
Ещё примеры планирования
Давайте рассмотрим ещё несколько примеров планирования.
Планирование замыканий
Планирование терминальных команд
Ручное Cron-выражение
Частые задачи
Выполнение команды каждые пять, десять или тридцать минут соответственно:
Ежедневные задачи
Ежедневные задачи в указанное время (24-часовой формат)
Задачи, выполняемые дважды в день
Задачи по будням
Еженедельные задачи
Ежемесячные задачи
Задачи, выполняемые в указанный день недели
Защита от наложения задач
По умолчанию запланированные задачи будут запущены, даже если предыдущий экземпляр всё ещё запущен. Для предотвращения такого поведения используйте метод PHP withoutOverlapping :
В этом примере команда foo будет запускаться каждую минуту, если она уже не запущена.
Указание конкретных сред для запуска задач
Указание необходимости запуска задачи даже в режиме техобслуживания
Запуск задачи только в случае возврата PHP true
Отправка вывода задачи на e-mail
Необходимо отправить вывод в файл перед тем, как он сможет быть послан по e-mail.
Отправка вывода задачи в указанное место
Выполнить ping указанного URL после запуска задачи
Комментарии (1)
Подскажите, куда делась команда app:name? Запускаю на выполнение php artisan app:name Appname, но выдает сообщение:
«There are no commands defined in the “app” namespace.»