Verification: a143cc29221c9be0

Php artisan tinker что это

Введение

Artisan – это интерфейс командной строки, входящий в состав Laravel. Он предлагает ряд полезных команд, которые помогут при создании приложения. Для просмотра списка всех доступных команд Artisan можно использовать команду list:

php artisan list

Каждая команда также включает в себя экран «справки», который отображает и описывает доступные аргументы и параметры команды. Чтобы просмотреть экран справки, используйте help перед именем команды:

php artisan help migrate

Laravel Sail

Если вы используете Laravel Sail в качестве локальной среды разработки, не забудьте использовать командную строку sail для вызова команд Artisan. Sail выполнит ваши команды Artisan в контейнерах Docker вашего приложения:

./sail artisan list

Tinker (REPL)

Laravel Tinker – это мощный REPL для фреймворка Laravel, основанный на пакете PsySH.

Установка

Все приложения Laravel по умолчанию включают Tinker. Однако вы можете установить Tinker с помощью Composer, если вы ранее удалили его из своего приложения:

composer require laravel/tinker
Ищете графический интерфейс для взаимодействия с приложением Laravel? Зацените Tinkerwell!

Использование

Tinker позволяет взаимодействовать полностью со всем приложением Laravel из командной строки, включая модели Eloquent, задачи, события и многое другое. Чтобы войти в среду Tinker, выполните команду tinker Artisan:

php artisan tinker

Вы можете опубликовать конфигурационный файл Tinker с помощью команды vendor:publish:

php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"
Глобальный помощник dispatch и метод dispatch класса Dispatchable зависят от "garbage collection" для помещения задания в очередь. Следовательно, при использовании Tinker вы должны использовать Bus::dispatch или Queue::push для отправки заданий.

Список разрешенных команд

Tinker использует список «разрешенных» команд, которые разрешено запускать Artisan в её среде. По умолчанию вы можете запускать команды clear-compiled, down, env, inspire, migrate, optimize и up. Для добавления в этот список больше команд, добавьте их в массив commands конфигурационного файла config/tinker.php:

'commands' => [
    
],

Черный список псевдонимов

Как правило, Tinker автоматически создает псевдонимы классов, когда вы взаимодействуете с ними в Tinker. Тем не менее, вы можете запретить такое поведение для некоторых классов, перечислив их в массиве dont_alias конфигурационного файла config/tinker.php:

'dont_alias' => [
    App\Models\User::class,
],

Написание команд

В дополнение к командам Artisan, вы можете создавать пользовательские команды. Команды обычно хранятся в каталоге app/Console/Commands; однако вы можете выбрать другое месторасположение, если эти команды могут быть загружены менеджером Composer.

Генерация команд

Чтобы сгенерировать новую команду, используйте команду make:command Artisan. Эта команда поместит новый класс команды в каталог app/Console/Commands вашего приложения. Если этот каталог не существует в вашем приложении, то Laravel предварительно создаст его:

php artisan make:command SendEmails

Структура команды

После создания команды следует заполнить свойства класса $signature и $description. Эти свойства будут отображаться на экране при использовании команды list. Свойство $signature также позволяет определять вводимые данные. Метод handle будет вызываться при выполнении команды. Вы можете разместить логику команды в этом методе.

Давайте рассмотрим пример команды. Обратите внимание, что мы можем запросить любые необходимые зависимости в методе handle команды. Контейнер служб Laravel автоматически внедрит все зависимости, типы которых объявлены в этом методе:

namespace App\Console\Commands;

use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command
{
    
    protected $signature = 'mail:send {user}';

    
    protected $description = 'Send a marketing email to a user';

    
    public function __construct()
    {
        parent::__construct();
    }

    
    public function handle(DripEmailer $drip)
    {
        $drip->send(User::find($this->argument('user')));
    }
}
Хорошей практикой повторного использования кода считается создание «простых» консольных команд с делегированием своих задач службам приложения. В приведенном примере мы внедряем класс службы для выполнения «затратной» отправки электронных писем.

Анонимные команды

Анонимные команды обеспечивают альтернативу определению консольных команд в виде классов. Точно так же, как замыкания маршрутов являются альтернативой контроллерам. В рамках метода commands файла app/Console/Kernel.php Laravel загружает файл routes/console.php:


protected function commands()
{
    require base_path('routes/console.php');
}

Этот файл не определяет маршруты HTTP, он определяет точки входа (маршруты) для консольных команд в приложении. В этом файле с помощью метода Artisan::command можно определить все анонимные консольные команды. Метод command принимает два аргумента: сигнатуру команды и замыкание, которое получает аргументы и параметры команды:

Artisan::command('mail:send {user}', function ($user) {
    $this->info("Sending email to: {$user}!");
});

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

Типизация зависимостей

Помимо получения аргументов и параметров, замыкание анонимной команды также принимает дополнительные зависимости из контейнера служб, необходимые для внедрения:

use App\Models\User;
use App\Support\DripEmailer;

Artisan::command('mail:send {user}', function (DripEmailer $drip, $user) {
    $drip->send(User::find($user));
});

Описания анонимных команд

При определении анонимных команд, можно использовать метод purpose для добавления описания команды. Это описание будет отображаться при запуске команд php artisan list и php artisan help:

Artisan::command('mail:send {user}', function ($user) {
    
})->purpose('Send a marketing email to a user');

Определение вводимых данных

При написании консольных команд обычно происходит сбор данных, получаемых от пользователя, с помощью аргументов или параметров. Laravel позволяет очень удобно определять входные данные, которые вы ожидаете от пользователя, используя свойство $signature команды. Свойство $signature позволяет определить имя, аргументы и параметры команды в едином выразительном синтаксисе, схожим с синтаксисом маршрутов.

Аргументы

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


protected $signature = 'mail:send {user}';

По желанию можно сделать аргументы необязательными или определить значения по умолчанию:


mail:send {user?}


mail:send {user=foo}

Параметры

Параметры, как и аргументы, являются разновидностью пользовательского ввода. Параметры должны иметь префикс в виде двух дефисов (--), при использовании их в командной строке. Существует два типа параметров: те, которые получают значение, и те, которые его не получают. Параметры, которые не получают значение, служат логическими «переключателями». Давайте рассмотрим пример такого варианта:


protected $signature = 'mail:send {user} {--queue}';

В этом примере при вызове команды Artisan может быть указан переключатель --queue. Если переключатель --queue передан, то значение этого параметра будет true. В противном случае значение будет false:

php artisan mail:send 1 --queue

Параметры со значениями

Давайте рассмотрим параметр, ожидающий значение. Если пользователь должен указать значение для параметра, то добавьте суффикс = к имени параметра:


protected $signature = 'mail:send {user} {--queue=}';

В этом примере пользователь может передать значение для параметра. Если параметр не указан при вызове команды, то его значение будет null:

php artisan mail:send 1 --queue=default

Параметру можно присвоить значение по умолчанию, указав его после имени. Если значение параметра не передано пользователем, то будет использовано значение по умолчанию:

mail:send {user} {--queue=default}

Псевдонимы параметров

Чтобы назначить псевдоним при определении параметра, вы можете указать его перед именем параметра и использовать символ разделителя | для отделения псевдонима от полного имени параметра:

mail:send {user} {--Q|queue}

Массивы данных

Чтобы определить, что аргументы или параметры ожидают массив данных, используйте метасимвол *. Во-первых, давайте рассмотрим пример, в котором описывается аргумент как массив данных:

mail:send {user*}

При вызове этого метода аргументы user могут передаваться по порядку в командную строку. Например, следующая команда установит значение user как ['foo', 'bar']:

php artisan mail:send foo bar

Метасимвол * можно комбинировать с необязательным определением аргумента, чтобы разрешить ноль или более экземпляров аргумента:

mail:send {user?*}

Параметр со множеством значений

При определении параметра, ожидающего множество значений, каждое значение передаваемого команде параметра должно иметь префикс с именем параметра:

mail:send {user} {--id=*}

php artisan mail:send --id=1 --id=2

Описания вводимых данных

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


protected $signature = 'mail:send
                        {user : The ID of the user}
                        {--queue= : Whether the job should be queued}';

Ввод/вывод команды

Получение входных данных

Во время выполнения команды вам, вероятно, потребуется получить доступ к значениям аргументов и параметров, принятых командой. Для этого вы можете использовать методы argument и option. Если аргумент или параметр не существует, то будет возвращено значение null.


public function handle()
{
    $userId = $this->argument('user');

    
}

Если вам нужно получить все аргументы в виде массива, вызовите метод arguments:

$arguments = $this->arguments();

Параметры могут быть получены так же легко, как и аргументы, используя метод option. Чтобы получить все параметры в виде массива, вызовите метод options:


$queueName = $this->option('queue');


$options = $this->options();

Запрос для ввода данных

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


public function handle()
{
    $name = $this->ask('What is your name?');
}

Метод secret похож на ask, но ввод пользователя не будет виден ему в консоли при вводе. Этот метод полезен при запросе конфиденциальной информации, например, пароля:

$password = $this->secret('What is the password?');

Запрос подтверждения

Если вам нужно получить от пользователя простое подтверждение «yes or no», то вы можете использовать метод confirm. По умолчанию этот метод возвращает значение false. Однако, если пользователь вводит y или yes в ответ на запрос, то метод возвращает true.

if ($this->confirm('Do you wish to continue?')) {
    
}

По желанию можно указать, что запрос подтверждения должен по умолчанию возвращать true, передав true в качестве второго аргумента метода confirm:

if ($this->confirm('Do you wish to continue?', true)) {
    
}

Автозавершение

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

$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);

В качестве альтернативы, вы можете передать замыкание в качестве второго аргумента метода anticipate. Замыкание будет вызываться каждый раз, когда пользователь вводит символ. Замыкание должно принимать строковый параметр, содержащий введенные пользователем данные, и возвращать массив вариантов для автозавершения:

$name = $this->anticipate('What is your address?', function ($input) {
    
});

Вопросы с множественным выбором

Если нужно предоставить пользователю предопределенный набор вариантов для выбора при задании вопроса, то используйте метод choice. Вы можете установить индекс массива для возвращаемого по умолчанию значения, если не выбран ни один из вариантов, передав индекс в качестве третьего аргумента метода:

$name = $this->choice(
    'What is your name?',
    ['Taylor', 'Dayle'],
    $defaultIndex
);

Кроме того, метод choice принимает необязательные четвертый и пятый аргументы для определения максимального количества попыток выбора действительного ответа и того, разрешен ли множественный выбор:

$name = $this->choice(
    'What is your name?',
    ['Taylor', 'Dayle'],
    $defaultIndex,
    $maxAttempts = null,
    $allowMultipleSelections = false
);

Вывод данных

Чтобы вывести в консоль, используйте методы line, info, comment, question, warn и error. Каждый из этих методов будет использовать соответствующие ANSI-цвета. Например, давайте покажем пользователю некоторую общую информацию. Обычно метод info отображается в консоли в виде зеленого текста:


public function handle()
{
    

    $this->info('The command was successful!');
}

Для отображения сообщения об ошибке используйте метод error. Текст сообщения об ошибке обычно отображается красным цветом:

$this->error('Something went wrong!');

Вы можете использовать метод line для отображения простого неокрашенного текста:

$this->line('Display this on the screen');

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


$this->newLine();


$this->newLine(3);

Таблицы

Метод table упрощает корректное форматирование нескольких строк / столбцов данных. Все, что вам нужно сделать, это указать имена столбцов и данные для таблицы, и Laravel автоматически рассчитает подходящую ширину и высоту таблицы:

use App\Models\User;

$this->table(
    ['Name', 'Email'],
    User::all(['name', 'email'])->toArray()
);

Индикаторы выполнения

Для длительно выполняемых задач было бы полезно показать индикатор выполнения, информирующий пользователя о том, насколько завершена задача. Используя метод withProgressBar, Laravel будет отображать индикатор выполнения и продвигать его для каждой итерации на заданное повторяемое значение:

use App\Models\User;

$users = $this->withProgressBar(User::all(), function ($user) {
    $this->performTask($user);
});

Иногда может потребоваться больший контроль над продвижением индикатора выполнения. Сначала определите общее количество шагов, через которые будет проходить процесс. Затем продвигайте индикатор выполнения после обработки каждого элемента:

$users = App\Models\User::all();

$bar = $this->output->createProgressBar(count($users));

$bar->start();

foreach ($users as $user) {
    $this->performTask($user);

    $bar->advance();
}

$bar->finish();
Для получения дополнительной информации ознакомьтесь с разделом документации компонента Symfony Progress Bar.

Регистрация команд

Все ваши консольные команды должны быть зарегистрированы в классе App\Console\Kernel, который является «ядром консоли» вашего приложения. Внутри метода commands этого класса вы увидите вызов метода load ядра. Метод load просканирует каталог app/Console/Commands и автоматически зарегистрирует каждую содержащуюся в нем команду в Artisan. Фактически, вы можете делать дополнительные вызовы метода load для сканирования других каталогов на наличие команд Artisan:


protected function commands()
{
    $this->load(__DIR__.'/Commands');
    $this->load(__DIR__.'/../Domain/Orders/Commands');

    
}

Вы можете самостоятельно зарегистрировать команды, добавив название класса команды в свойство $commands класса App\Console\Kernel. При загрузке Artisan, все команды, перечисленные в этом свойстве будут доступны в контейнере служб и зарегистрированы в Artisan:

protected $commands = [
    Commands\SendEmails::class
];

Программное выполнение команд

По желанию можно выполнить команду Artisan за пределами CLI. Например, вы можете запустить команду Artisan в маршруте или контроллере. Для этого можно использовать метод call фасада Artisan. Метод call принимает в качестве первого аргумента либо имя сигнатуры команды, либо имя класса, а в качестве второго – массив параметров команды. Будет возвращен код выхода / возврата:

use Illuminate\Support\Facades\Artisan;

Route::post('/user/{user}/mail', function ($user) {
    $exitCode = Artisan::call('mail:send', [
        'user' => $user, '--queue' => 'default'
    ]);

    
});

Кроме того, вы можете передать методу call команду полностью в виде строки:

Artisan::call('mail:send 1 --queue=default');

Передача массива значений

Если ваша команда определяет параметр, который принимает массив, то вы можете передать массив значений этому параметру:

use Illuminate\Support\Facades\Artisan;

Route::post('/mail', function () {
    $exitCode = Artisan::call('mail:send', [
        '--id' => [5, 13]
    ]);
});

Передача значений логического типа

Если необходимо указать значение параметра, который не принимает строковые значения, например флаг --force в команде migrate:refresh, то вы должны передать true или false как значение параметра:

$exitCode = Artisan::call('migrate:refresh', [
    '--force' => true,
]);

Очереди команд Artisan

Используя метод queue фасада Artisan, вы можете даже поставить команды Artisan в очередь, чтобы они обрабатывались в фоновом режиме обработчиком очереди. Перед использованием этого метода убедитесь, что вы настроили очереди и был запущен слушатель очереди:

use Illuminate\Support\Facades\Artisan;

Route::post('/user/{user}/mail', function ($user) {
    Artisan::queue('mail:send', [
        'user' => $user, '--queue' => 'default'
    ]);

    
});

Используя методы onConnection и onQueue, вы также можете указать соединение или очередь, в которую должна быть отправлена команда Artisan:

Artisan::queue('mail:send', [
    'user' => 1, '--queue' => 'default'
])->onConnection('redis')->onQueue('commands');

Вызов команд из других команд

По желанию можно вызвать другие команды из существующей команды Artisan. Вы можете сделать это с помощью метода call. Метод call принимает имя команды и массив аргументов / параметров команды:


public function handle()
{
    $this->call('mail:send', [
        'user' => 1, '--queue' => 'default'
    ]);

    
}

Если вы хотите вызвать другую консольную команду в тихом режиме, то используйте метод callSilently. Метод callSilently имеет ту же сигнатуру, что и метод call:

$this->callSilently('mail:send', [
    'user' => 1, '--queue' => 'default'
]);

Обработка сигналов

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.

Компонент Symfony Console, на основе которого сделан Artisan, позволяет указать, какие сигналы процессов обрабатываются вашей командой. Например, Вы можете указать, что Ваша команда обрабатывает сигналы SIGINT и SIGTERM.

To get started, you should implement the interface on your Artisan command class. This interface requires you to define two methods: getSubscribedSignals and handleSignal:

Чтобы воспользоваться этой фичей, имплементируйте Symfony\Component\Console\Command\SignalableCommandInterface. Этот интерфейс требует наличия в классе методов getSubscribedSignals и handleSignal:

use Symfony\Component\Console\Command\SignalableCommandInterface;

class StartServer extends Command implements SignalableCommandInterface
{
    

    
    public function getSubscribedSignals(): array
    {
        return [SIGINT, SIGTERM];
    }

    
    public function handleSignal(int $signal): void
    {
        if ($signal === SIGINT) {
            $this->stopServer();

            return;
        }
    }
}

Метод getSubscribeSignals должен возвращать массив сигналов, который ваша команда может обрабатывать, а метод handleSignal принимает сигнал и может реагировать соответственно.

Настройка заготовок команд (stubs)

Команды make консоли Artisan используются для создания различных классов, таких как контроллеры, задания, миграции и тесты. Эти классы создаются с помощью файлов «заготовок», которые заполняются значениями на основе ваших входных данных. Однако, иногда может потребоваться внести небольшие изменения в файлы, создаваемые с помощью Artisan. Для этого можно использовать команду stub:publish, чтобы опубликовать наиболее распространенные заготовки для их дальнейшего изменения:

php artisan stub:publish

Опубликованные заготовки будут расположены в каталоге stubs корня вашего приложения. Любые изменения, внесенные вами в эти заготовки, будут учтены при создании соответствующих классов с помощью команд make Artisan.

Введение

Artisan - это интерфейс командной строки (CLI) входящий в состав Laravel. Он предоставляет ряд команд, которые будут полезны при разработке вашего приложения. Чтобы посмотреть список всех доступных Artisan-команд, вы можете воспользоваться командой list:

php artisan list

Каждая команда так же содержит "подсказку", которая отображает и описывает все возможные аргументы и опции доступные для команды. Чтобы увидеть подсказку, просто напишите перед названием команды слово help:

php artisan help migrate

Интерфейс ввода/вывода Laravel REPL

В состав всех Laravel приложений входит Tinker, REPL интерфейс основанный на пакете PsySH. Tinker позволяет вам взаимодействовать полностью со всем Laravel приложением из командной строки, включая Eloquent ORM, задачи в очереди, события, и т.д. Чтобы запустить Tinker, выполните Artisan команду tinker:

php artisan tinker

Написание команд

Помимо базовых команд включенных в состав Artisan, вы так же можете написать свои собственные команды. Обычно они хранятся в директории app/Console/Commands; однако, вы можете сами выбрать место хранения команд, лишь бы они загружались с помощью Composer.

Генерация команд

Чтобы создать новую команду, вам нужно выполнить Artisan-команду make:command. Она создаст вам новый класс команды в директории app/Console/Commands. Не переживайте по поводу того, что этой папки не существует в вашем приложении. Она создастся автоматически, как только вы запустите Artisan-команду make:command в первый раз. Сгенерированный файл будут содержать стандартный набор свойств и методов необходимый для всех команд:

php artisan make:command SendEmails

Затем вам надо зарегистрировать команду, тогда она сможет быть запущена через командный интерфейс Artisan.

Структура команды

После генерации вашей команды вы должны заполнить свойства класса signature и description, которые используются для отображения вашей команды в списке list. Когда команда будет запущена, будет исполнен метод handle. В этом методе вы можете разместить логику команды.

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

Давайте посмотрим на пример команды. Обратите внимание, что мы можем внедрять любые зависимости, которые нам могут потребоваться, в конструктор команды. Сервис-контейнер Laravel автоматически внедрит все зависимости, указанные в конструкторе:

namespace App\Console\Commands;

use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command
{
    
    protected $signature = 'email:send {user}';

    
    protected $description = 'Send drip e-mails to a user';

    
    protected $drip;

    
    public function __construct(DripEmailer $drip)
    {
        parent::__construct();

        $this->drip = $drip;
    }

    
    public function handle()
    {
        $this->drip->send(User::find($this->argument('user')));
    }
}

Команды на функциях-замыканиях

Команды, основанные на функциях-замыканиях (анонимных функциях), предоставляют альтернативу определению команд как классов. Точно так же, как и роуты с анонимными функциями являются альтернативой контроллерам, так и команды с анонимными функциями являются альтернативой командам-классам. Внутри метода commands файла app/Console/Kernel.php Laravel загружает файл routes/console.php:


protected function commands()
{
    require base_path('routes/console.php');
}

Хотя этот файл не определяет HTTP роуты, зато он определяет точки входа в консоль вашего приложения. Внутри этого файла вы можете определить все точки на основе функций-замыканий, используя методArtisan::command. Метод command принимает два аргумента: сигнатуру команды и функцию, которая принимает аргументы и опции самой команды:

Artisan::command('build {project}', function ($project) {
    $this->info("Building {$project}!");
});

Функция-замыкание будет привязана к экземпляру команды, так что вы будете иметь полный доступ ко всем методам, которым обычно есть доступ у команд-классов.

Объявление типов (Type-Hinting) зависимостей

Помимо получения аргументов и опций, в команде на основе анонимной функции могут быть дополнительно объявлены типы зависимостей, которые вы захотите получить из сервис-контейнера:

use App\User;
use App\DripEmailer;

Artisan::command('email:send {user}', function (DripEmailer $drip, $user) {
    $drip->send(User::find($user));
});

Описание команды на основе функции-замыкания

Когда вы определяете команду на основе функции, вы так же можете использовать метод describe, чтобы добавить описание для вашей команды. Это описание будет отображаться, когда вы запустите команды php artisan list или php artisan help:

Artisan::command('build {project}', function ($project) {
    $this->info("Building {$project}!");
})->describe('Build the project');

Определенние входных данных

Получение входных данных от пользователя через аргументы или опции является общепринятым при написании консольных команд. В Laravel можно очень удобно определить, какие входящие данные вы ждете от пользователя, используя свойство signature ваших команд. Свойство signature позволяет вам определить имя, аргументы и опции для команды с помощью выразительного синтаксиса, похожего на определение роутов.

Аргументы

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


protected $signature = 'email:send {user}';

Также вы можете сделать аргументы необязательными или определить для аргументов значение по умолчанию:


email:send {user?}


email:send {user=foo}

Опции

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


protected $signature = 'email:send {user} {--queue}';

В этом примере опция --queue может быть указана при вызове Artisan команды. Если будет передана опция --queue, то значение этой опции будет true. В противном случае значение будет false:

php artisan email:send 1 --queue

Опции со значениями

Теперь давайте взглянем на опции, которые должны принимать значения. Если вы хотите, чтобы пользователь передал вам значение опции, поставьте после названия опции знак =:


protected $signature = 'email:send {user} {--queue=}';

В этом примере пользователь может передать значение опции, как указано ниже:

php artisan email:send 1 --queue=default

Вы можете назначить значение по умолчанию для опции, указав его после названия опции. Если пользователь не передал никакое значение, то будет использоваться значение по умолчанию:

email:send {user} {--queue=default}

Сокращения для опций

Чтобы назначить сокращение при определении опции, вы можете указать его до названия опции и использовать разделитель |, чтобы отделить сокращение от полного названия опции:

email:send {user} {--Q|queue}

Массивы входных данных

Если вы хотите показать, что аргументов или опций может быть несколько, то можете использовать символ * - в таком случае они придут в команбу в виде массива. Для начала давайте посмотрим на пример:

email:send {user*}

При вызове этого метода, аргументы user могут быть указаны по очереди. Например, следующая команда установитuser значение ['foo', 'bar']:

php artisan email:send foo bar

При определении опции, которая будет принимать массив, каждое значение опции должно передаваться с префиксом имени этой опции:

email:send {user} {--id=*}

php artisan email:send --id=1 --id=2

Описания входных данных

Вы можете назначить описания для входящих аргументов и опций, разделив сам параметр и его описание двоеточием. Если вам не хватает места для определения вашей команды, не стесняйтесь разбивать ваше определение на разных строках:


protected $signature = 'email:send
                        {user : ID пользователя}
                        {--queue= : Ставить ли задачу в очередь}';

Команда ввода/вывода

Получение входных данных

Во время выполнения команды, вам, очевидно, потребуется доступ к значениям аргументов и опций, переданных в команду. Чтобы получить их, вы можете воспользоваться методами argument и option:


public function handle()
{
    $userId = $this->argument('user');

    
}

Если вы хотие получить все аргументы в виде массива array, вызовите метод arguments:

$arguments = $this->arguments();

Получить опции так же просто, как и аргументы - нужно использовать метод option. Чтобы получить все опции в виде массива, воспользуйтесь методом options:


$queueName = $this->option('queue');


$options = $this->options();

Если аргумент или опция не существуют, тогда функция вернет значение null.

Запрашивание входных данных

В дополнение к отображению выходных данных, вы можете запросить у пользователя ввести входные данные прямо во время выполнения команды. Метод ask сделает запрос пользователю, с указанным вопросом, получит ответ, и вернет ответ пользователя обратно в команду:


public function handle()
{
    $name = $this->ask('What is your name?');
}

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

$password = $this->secret('What is the password?');

Запрос подтверждения

Если вам нужно запросить у пользователя простое подтверждение, вы можете воспользоваться методом confirm. По умолчанию этот метод вернет false. Однако, если пользователь введет y или yes в ответ на запрос, тогда метод вернет true.

if ($this->confirm('Do you wish to continue?')) {
    
}

Автовыбор

Метод anticipate может использоваться, чтобы обеспечить автовыбор возможных вариантов. Пользователь может выбрать любой ответ, независимо от подсказок автовыбора:

$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);

Вопросы с множественным выбором

Если вам нужно дать пользователю набор предопределенных вариантов, вы можете использовать метод choice. Вы можете установить значение по умолчанию, если никакой вариант не выбран:

$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $default);

Вывод данных

Чтобы вывести данные в консоль, воспользуйтесь методами line, info, comment, question и error. Каждый из этих методов будет использовать соответствующие ANSI цвета для своего предназначения. Например, давайте отобразим некоторую общую информацию пользователю. Как правило, метод info отобразится в консоли в виде зеленого текста:


public function handle()
{
    $this->info('Отобразить это на экране');
}

Чтобы отобразить сообщение об ошибке, используйте метод error. Сообщения об ошибке обычно отображаются красным цветом:

$this->error('Что-то пошло не так!');

Если вы хотите вывести обычное, не цветное сообщение, используйте метод line:

$this->line('Отобразить это на экране');

Табличная разметка

Метод table легко и правильно отформатирует данные с несколькими строками/колонками. Просто передайте в метод заголовки и строки. Ширина и высота будут динамически рассчитаны на основании предоставленных данных:

$headers = ['Name', 'Email'];

$users = App\User::all(['name', 'email'])->toArray();

$this->table($headers, $users);

Индикаторы выполнения

Было бы полезно отображать индикаторы выполнения для долго выполняющихся задач. Используя объект вывода данных, мы можем запустить, увеличить и остановить индикатор выполнения. Для начала определите общее количество шагов итерации процесса. Затем увеличивайте индикатор выполнения после каждого обработанного элемента:

$users = App\User::all();

$bar = $this->output->createProgressBar(count($users));

foreach ($users as $user) {
    $this->performTask($user);

    $bar->advance();
}

$bar->finish();

Для более продвинутых возможностей, посмотрите документацию компонента Symfony Progress Bar.

Регистрация команд

После того, как вы напишите свою команду, вам необходимо будет зарегистрировать ее в Artisan. Все команды регистрируются в файле app/Console/Kernel.php. Внутри файла вы найдете список всех команд в свойстве commands. Чтобы зарегистрировать свою, просто добавьте название класса команды в список. Когда Artisan загрузится, все команды из этого списка будут доступны в сервис-контейнере и зарегистрированы в Artisan:

protected $commands = [
    Commands\SendEmails::class
];

Вступление

Artisan - это интерфейс командной строки, включенный в Laravel. Он предоставляет ряд полезных команд, которые могут помочь вам при создании приложения. Чтобы просмотреть список всех доступных команд Artisan, вы можете использовать listкоманду:

php artisan list

Каждая команда также содержит экран «справки», который отображает и описывает доступные аргументы и параметры команды. Чтобы просмотреть экран справки, перед именем команды введите help:

php artisan help migrate

Тинкер (REPL)

Все приложения Laravel включают Tinker, REPL, основанный на пакете PsySH . Tinker позволяет вам взаимодействовать со всем вашим приложением Laravel из командной строки, включая Eloquent ORM, задания, события и многое другое. Чтобы войти в среду Tinker, выполните команду tinkerArtisan:

php artisan tinker

Вы можете опубликовать файл конфигурации Tinker с помощью команды:vendor:publish

php artisan vendor:publish --provider="Laravel\Tinker\TinkerServiceProvider"

Белый список команд

Тинкер использует белый список, чтобы определить, какие команды Artisan разрешено запускать в своей оболочке. По умолчанию, вы можете запустить , , , , , , и команды. Если вы хотите добавить в белый список больше команд, вы можете добавить их в массив в вашем файле конфигурации:clear-compileddownenvinspiremigrateoptimizeupcommandstinker.php

'commands' => [
    // App\Console\Commands\ExampleCommand::class,
],

Alias ​​Blacklist

Как правило, Tinker автоматически создает псевдонимы классов, когда они вам нужны в Tinker. Тем не менее, вы можете не использовать псевдонимы для некоторых классов Вы можете сделать это, перечислив классы в dont_aliasмассиве вашего файла конфигурации:tinker.php

'dont_alias' => [
    App\User::class,
],

Написание команд

В дополнение к командам, поставляемым с Artisan, вы также можете создавать свои собственные команды. Команды обычно хранятся в каталоге; тем не менее, вы можете выбрать свое собственное место хранения, если ваши команды могут быть загружены Composer.app/Console/Commands

Генерация команд

Чтобы создать новую команду, используйте команду Artisan. Эта команда создаст новый класс команд в каталоге. Не беспокойтесь, если этот каталог не существует в вашем приложении, так как он будет создан при первом запуске команды Artisan. Сгенерированная команда будет включать набор свойств и методов по умолчанию, которые присутствуют во всех командах:make:commandapp/Console/Commandsmake:command

php artisan make:command SendEmails

Структура команды

После создания вашей команды, вы должны заполнить signatureи descriptionсвойство класса, который будет использоваться при отображении вашей команды на listэкране. handleМетод будет вызываться , когда ваша команда будет выполнена. Вы можете разместить свою командную логику в этом методе.

Для большего повторного использования кода рекомендуется оставлять команды консоли легкими и позволять им обращаться к службам приложений для выполнения своих задач. В приведенном ниже примере обратите внимание, что мы внедряем класс обслуживания, чтобы выполнить «тяжелую работу» по отправке электронных писем.

Давайте посмотрим на пример команды. Обратите внимание, что мы можем внедрить любые зависимости, которые нам нужны, в handleметод команды. Служебный контейнер Laravel автоматически внедрит все зависимости, на которые намекают типы в сигнатуре этого метода:

send(User::find($this->argument('user')));
    }
}

Закрытие команды

Команды на основе замыканий предоставляют альтернативу определению консольных команд как классов. Точно так же, как замыкания маршрута являются альтернативой контроллерам, думайте о замыканиях команды как об альтернативе классам команд. В commandsметоде вашего файла Laravel загружает файл:app/Console/Kernel.phproutes/console.php

/**
 * Register the Closure based commands for the application.
 *
 * @return void
 */
protected function commands()
{
    require base_path('routes/console.php');
}

Хотя этот файл не определяет HTTP-маршруты, он определяет консольные точки входа (маршруты) в ваше приложение. В этом файле вы можете определить все свои маршруты на основе Closure, используя метод. Метод принимает два аргумента: команда подписи и Closure , который принимает команды аргументы и опции:Artisan::commandcommand

Artisan::command('build {project}', function ($project) {
    $this->info("Building {$project}!");
});

Closure привязан к базовому экземпляру команды, поэтому у вас есть полный доступ ко всем вспомогательным методам, к которым вы, как правило, сможете обращаться в классе полной команды.

Зависимости подсказок типа

В дополнение к получению аргументов и параметров вашей команды, команда Closures также может напечатать дополнительные зависимости, которые вы хотели бы разрешить из контейнера службы :

use App\User;
use App\DripEmailer;

Artisan::command('email:send {user}', function (DripEmailer $drip, $user) {
    $drip->send(User::find($user));
});

Описание команды закрытия

При определении команды на основе замыкания вы можете использовать describeметод, чтобы добавить описание к команде. Это описание будет отображаться при запуске команд php artisan listили php artisan help:

Artisan::command('build {project}', function ($project) {
    $this->info("Building {$project}!");
})->describe('Build the project');

Определение входных ожиданий

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

Аргументы

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

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'email:send {user}';

Вы также можете сделать аргументы необязательными и определить значения по умолчанию для аргументов:

// Optional argument...
email:send {user?}

// Optional argument with default value...
email:send {user=foo}

Опции

Опции, как аргументы, являются еще одной формой пользовательского ввода. Опции имеют префикс двух дефисов ( --), если они указаны в командной строке. Есть два типа опций: те, которые получают значение, и те, которые не получают. Параметры, которые не получают значения, служат логическим «переключателем». Давайте посмотрим на пример этого типа опции:

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'email:send {user} {--queue}';

В этом примере --queueпереключатель может быть указан при вызове команды Artisan. Если --queueпереключатель пройден, значение параметра будет true. В противном случае значение будет false:

php artisan email:send 1 --queue

Параметры со значениями

Далее, давайте посмотрим на параметр, который ожидает значение. Если пользователь должен указать значение для параметра, добавьте суффикс имени параметра со =знаком:

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'email:send {user} {--queue=}';

В этом примере пользователь может передать значение для опции следующим образом:

php artisan email:send 1 --queue=default

Вы можете назначить значения по умолчанию для параметров, указав значение по умолчанию после имени параметра. Если значение параметра не передано пользователем, будет использовано значение по умолчанию:

email:send {user} {--queue=default}

Варианты ярлыков

Чтобы назначить ярлык при определении параметра, вы можете указать его перед именем параметра и использовать | разделитель, чтобы отделить ярлык от полного имени опции:

email:send {user} {--Q|queue}

Массивы ввода

Если вы хотите определить аргументы или опции для ожидания ввода массива, вы можете использовать *символ. Сначала давайте рассмотрим пример, в котором указан аргумент массива:

email:send {user*}

При вызове этого метода userаргументы могут передаваться по порядку в командную строку. Например, следующая команда установит значение userв :['foo', 'bar']

php artisan email:send foo bar

При определении параметра, который ожидает ввода массива, перед каждым значением параметра, передаваемым команде, должен стоять префикс с именем параметра:

email:send {user} {--id=*}

php artisan email:send --id=1 --id=2

Входные описания

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

/**
 * The name and signature of the console command.
 *
 * @var string
 */
protected $signature = 'email:send
                        {user : The ID of the user}
                        {--queue= : Whether the job should be queued}';

Командный ввод / вывод

Получение ввода

Пока ваша команда выполняется, вам, очевидно, потребуется получить доступ к значениям аргументов и опций, принятых вашей командой. Для этого вы можете использовать argumentи optionметоды:

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $userId = $this->argument('user');

    //
}

Если вам нужно получить все аргументы как array, вызовите argumentsметод:

$arguments = $this->arguments();

Опции могут быть получены так же легко, как аргументы, используя optionметод. Чтобы получить все параметры в виде массива, вызовите optionsметод:

// Retrieve a specific option...
$queueName = $this->option('queue');

// Retrieve all options...
$options = $this->options();

Если аргумент или опция не существует, nullбудет возвращено.

Подсказка для ввода

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

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $name = $this->ask('What is your name?');
}

secretМетод аналогичен ask, но вход пользователя не будет виден им , как они типа в консоли. Этот метод полезен при запросе конфиденциальной информации, такой как пароль:

$password = $this->secret('What is the password?');

Спрашивая подтверждение

Если вам нужно запросить у пользователя простое подтверждение, вы можете использовать этот confirmметод. По умолчанию этот метод вернется false. Однако, если пользователь вводит yили yesв ответ на приглашение, метод вернется true.

if ($this->confirm('Do you wish to continue?')) {
    //
}

Автодополнение

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

$name = $this->anticipate('What is your name?', ['Taylor', 'Dayle']);

Вопросы с множественным выбором

Если вам нужно предоставить пользователю предопределенный набор вариантов, вы можете использовать этот choiceметод. Вы можете установить индекс массива значения по умолчанию, которое будет возвращено, если не выбрана ни одна опция:

$name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);

Запись вывода

Для того, чтобы отправить вывод в консоли, используйте lineinfocommentquestionи errorметоды. Каждый из этих методов будет использовать соответствующие цвета ANSI для своих целей. Например, давайте отобразим некоторую общую информацию для пользователя. Как правило, infoметод будет отображаться в консоли зеленым текстом:

/**
 * Execute the console command.
 *
 * @return mixed
 */
public function handle()
{
    $this->info('Display this on the screen');
}

Чтобы отобразить сообщение об ошибке, используйте errorметод. Текст сообщения об ошибке обычно отображается красным:

$this->error('Something went wrong!');

Если вы хотите отобразить простой неокрашенный вывод консоли, используйте lineметод:

$this->line('Display this on the screen');

Макеты таблиц

Этот tableметод позволяет легко форматировать несколько строк / столбцов данных. Просто передайте заголовки и строки методу. Ширина и высота будут рассчитываться динамически на основе данных:

$headers = ['Name', 'Email'];

$users = App\User::all(['name', 'email'])->toArray();

$this->table($headers, $users);

Прогресс Бары

Для долгосрочных задач может быть полезно показать индикатор прогресса. Используя выходной объект, мы можем запускать, продвигать и останавливать индикатор выполнения. Сначала определите общее количество шагов, через которые будет проходить процесс. Затем продвигайте индикатор выполнения после обработки каждого элемента:

$users = App\User::all();

$bar = $this->output->createProgressBar(count($users));

$bar->start();

foreach ($users as $user) {
    $this->performTask($user);

    $bar->advance();
}

$bar->finish();

Для получения более подробных сведений ознакомьтесь с документацией по компоненту Symfony Progress Bar .

Регистрация команд

Из-за loadвызова метода в методе ядра вашей консоли commandsвсе команды в каталоге будут автоматически зарегистрированы в Artisan. Фактически вы можете сделать дополнительные вызовы метода для сканирования других каталогов на наличие команд Artisan:app/Console/Commandsload

/**
 * Register the commands for the application.
 *
 * @return void
 */
protected function commands()
{
    $this->load(__DIR__.'/Commands');
    $this->load(__DIR__.'/MoreCommands');

    // ...
}

Вы также можете вручную зарегистрировать команды, добавив его имя класса в $commandsсвойство вашего файла. Когда Artisan загружается, все команды, перечисленные в этом свойстве, будут разрешены сервисным контейнером и зарегистрированы в Artisan:app/Console/Kernel.php

protected $commands = [
    Commands\SendEmails::class
];