Skip to content

Artisan 콘솔

소개

Artisan은 Laravel에 포함된 명령 줄 인터페이스입니다. Artisan은 애플리케이션 루트에 artisan 스크립트로 존재하며 애플리케이션을 빌드하는 동안 도움이 될 수 있는 여러 가지 유용한 명령을 제공합니다. 사용 가능한 모든 Artisan 명령 목록을 보려면 list 명령을 사용할 수 있습니다.

php artisan list

모든 명령에는 명령의 사용 가능한 인수 및 옵션을 표시하고 설명하는 "도움말" 화면도 포함되어 있습니다. 도움말 화면을 보려면 명령 이름 앞에 help를 붙이세요.

php artisan help migrate

Laravel Sail

Laravel Sail을 로컬 개발 환경으로 사용하는 경우 Artisan 명령을 호출하려면 sail 명령줄을 사용해야 합니다. Sail은 애플리케이션의 Docker 컨테이너 내에서 Artisan 명령을 실행합니다.

./vendor/bin/sail artisan list

Tinker (REPL)

Laravel Tinker는 PsySH 패키지를 기반으로 하는 Laravel 프레임워크를 위한 강력한 REPL입니다.

설치

모든 Laravel 애플리케이션은 기본적으로 Tinker를 포함합니다. 하지만 애플리케이션에서 Tinker를 이전에 제거한 경우 Composer를 사용하여 설치할 수 있습니다.

composer require laravel/tinker
lightbulb

Laravel 애플리케이션과 상호 작용할 때 핫 리로딩, 다중 줄 코드 편집 및 자동 완성을 찾고 계십니까? Tinkerwell을 확인해 보세요!

사용법

Tinker를 사용하면 Eloquent 모델, 작업, 이벤트 등을 포함하여 명령줄에서 전체 Laravel 애플리케이션과 상호 작용할 수 있습니다. Tinker 환경으로 들어가려면 tinker Artisan 명령을 실행하세요.

php artisan tinker

vendor:publish 명령을 사용하여 Tinker의 구성 파일을 게시할 수 있습니다.

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

Dispatchable 클래스의 dispatch 헬퍼 함수와 dispatch 메서드는 작업을 큐에 넣기 위해 가비지 컬렉션에 의존합니다. 따라서 tinker를 사용할 때는 Bus::dispatch 또는 Queue::push를 사용하여 작업을 디스패치해야 합니다.

명령어 허용 목록

Tinker는 셸 내에서 실행할 수 있는 Artisan 명령어를 결정하기 위해 "허용" 목록을 활용합니다. 기본적으로 clear-compiled, down, env, inspire, migrate, migrate:install, upoptimize 명령어를 실행할 수 있습니다. 더 많은 명령어를 허용하려면 tinker.php 구성 파일의 commands 배열에 추가할 수 있습니다.

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

별칭을 지정하지 않아야 하는 클래스

일반적으로 Tinker는 Tinker에서 클래스와 상호 작용할 때 자동으로 클래스에 별칭을 지정합니다. 그러나 일부 클래스에는 별칭을 지정하고 싶지 않을 수 있습니다. tinker.php 구성 파일의 dont_alias 배열에 클래스를 나열하여 이를 수행할 수 있습니다.

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

명령어 작성

Artisan에서 제공하는 명령어 외에도 사용자 정의 명령어를 빌드할 수 있습니다. 명령어는 일반적으로 app/Console/Commands 디렉토리에 저장됩니다. 그러나 명령어를 Composer에서 로드할 수 있는 한 원하는 저장 위치를 자유롭게 선택할 수 있습니다.

명령어 생성

새로운 명령어를 생성하려면 make:command Artisan 명령어를 사용할 수 있습니다. 이 명령어는 app/Console/Commands 디렉토리에 새로운 명령어 클래스를 생성합니다. 애플리케이션에 이 디렉토리가 존재하지 않더라도 걱정하지 마십시오. make:command Artisan 명령어를 처음 실행할 때 생성됩니다.

php artisan make:command SendEmails

명령어 구조

명령어를 생성한 후에는 클래스의 signaturedescription 속성에 적절한 값을 정의해야 합니다. 이러한 속성은 list 화면에 명령어를 표시할 때 사용됩니다. signature 속성을 사용하면 명령어의 입력 기대값을 정의할 수도 있습니다. handle 메서드는 명령어가 실행될 때 호출됩니다. 이 메서드에 명령어 로직을 배치할 수 있습니다.

명령어 예시를 살펴보겠습니다. 명령어의 handle 메서드를 통해 필요한 모든 종속성을 요청할 수 있습니다. Laravel 서비스 컨테이너는 이 메서드의 시그니처에 타입 힌트가 지정된 모든 종속성을 자동으로 주입합니다.

<?php
 
namespace App\Console\Commands;
 
use App\Models\User;
use App\Support\DripEmailer;
use Illuminate\Console\Command;
 
class SendEmails extends Command
{
/**
* 콘솔 명령어의 이름 및 시그니처입니다.
*
* @var string
*/
protected $signature = 'mail:send {user}';
 
/**
* 콘솔 명령어 설명입니다.
*
* @var string
*/
protected $description = '사용자에게 마케팅 이메일을 보냅니다.';
 
/**
* 콘솔 명령어 실행.
*/
public function handle(DripEmailer $drip): void
{
$drip->send(User::find($this->argument('user')));
}
}
lightbulb

코드 재사용성을 높이기 위해 콘솔 명령어를 가볍게 유지하고, 작업을 수행하기 위해 애플리케이션 서비스로 위임하는 것이 좋습니다. 위의 예시에서, 이메일 전송의 "무거운 작업"을 수행하기 위해 서비스 클래스를 주입하는 것을 주목하세요.

종료 코드

handle 메서드에서 아무것도 반환되지 않고 명령어가 성공적으로 실행되면, 명령어는 성공을 나타내는 0 종료 코드로 종료됩니다. 그러나 handle 메서드는 선택적으로 정수를 반환하여 명령어의 종료 코드를 수동으로 지정할 수 있습니다.

$this->error('뭔가 잘못되었습니다.');
 
return 1;

명령어 내의 어떤 메서드에서든 명령어를 "실패"시키고 싶다면 fail 메서드를 사용할 수 있습니다. fail 메서드는 명령어 실행을 즉시 종료하고 종료 코드 1을 반환합니다.

$this->fail('뭔가 잘못되었습니다.');

클로저 명령어

클로저 기반 명령어는 콘솔 명령어를 클래스로 정의하는 것에 대한 대안을 제공합니다. 라우트 클로저가 컨트롤러에 대한 대안인 것과 마찬가지로, 명령어 클로저를 명령어 클래스에 대한 대안으로 생각하세요.

routes/console.php 파일은 HTTP 라우트를 정의하지 않지만, 애플리케이션에 대한 콘솔 기반 진입점(라우트)을 정의합니다. 이 파일 내에서 Artisan::command 메서드를 사용하여 모든 클로저 기반 콘솔 명령어를 정의할 수 있습니다. command 메서드는 두 가지 인수를 받습니다: 명령어 시그니처와 명령어의 인수 및 옵션을 받는 클로저입니다.

Artisan::command('mail:send {user}', function (string $user) {
$this->info("{$user}에게 이메일을 보내는 중!");
});

클로저는 기본 명령어 인스턴스에 바인딩되므로 일반적인 명령어 클래스에서 액세스할 수 있는 모든 도우미 메서드에 완전히 액세스할 수 있습니다.

타입 힌트 종속성

명령어의 인수 및 옵션을 받는 것 외에도, 명령어 클로저는 서비스 컨테이너에서 확인하려는 추가 종속성에 타입 힌트를 지정할 수도 있습니다.

use App\Models\User;
use App\Support\DripEmailer;
 
Artisan::command('mail:send {user}', function (DripEmailer $drip, string $user) {
$drip->send(User::find($user));
});

클로저 명령어 설명

클로저 기반 명령어를 정의할 때, purpose 메서드를 사용하여 명령어에 설명을 추가할 수 있습니다. 이 설명은 php artisan list 또는 php artisan help 명령어를 실행할 때 표시됩니다.

Artisan::command('mail:send {user}', function (string $user) {
// ...
})->purpose('사용자에게 마케팅 이메일을 보냅니다.');

격리 가능한 명령어

exclamation

이 기능을 사용하려면 애플리케이션이 기본 캐시 드라이버로 memcached, redis, dynamodb, database, file 또는 array 캐시 드라이버를 사용해야 합니다. 또한 모든 서버가 동일한 중앙 캐시 서버와 통신해야 합니다.

때로는 명령어의 인스턴스가 한 번에 하나만 실행되도록 해야 할 수 있습니다. 이를 위해 명령어 클래스에서 Illuminate\Contracts\Console\Isolatable 인터페이스를 구현할 수 있습니다.

<?php
 
namespace App\Console\Commands;
 
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\Isolatable;
 
class SendEmails extends Command implements Isolatable
{
// ...
}

명령어가 Isolatable로 표시되면 Laravel은 자동으로 명령어에 --isolated 옵션을 추가합니다. 해당 옵션으로 명령어를 호출하면 Laravel은 해당 명령어의 다른 인스턴스가 이미 실행 중인지 확인합니다. Laravel은 애플리케이션의 기본 캐시 드라이버를 사용하여 원자적 잠금을 획득하려고 시도하여 이를 수행합니다. 명령어의 다른 인스턴스가 실행 중인 경우, 명령어는 실행되지 않습니다. 그러나 명령어는 여전히 성공적인 종료 상태 코드로 종료됩니다.

php artisan mail:send 1 --isolated

명령어를 실행할 수 없을 때 반환해야 하는 종료 상태 코드를 지정하려면 isolated 옵션을 통해 원하는 상태 코드를 제공할 수 있습니다.

php artisan mail:send 1 --isolated=12

Lock ID

기본적으로 Laravel은 애플리케이션의 캐시에서 원자적 잠금을 획득하는 데 사용되는 문자열 키를 생성하기 위해 명령어의 이름을 사용합니다. 그러나 Artisan 명령어 클래스에서 isolatableId 메서드를 정의하여 이 키를 사용자 정의할 수 있으며, 이를 통해 명령어의 인수 또는 옵션을 키에 통합할 수 있습니다.

/**
* Get the isolatable ID for the command.
*/
public function isolatableId(): string
{
return $this->argument('user');
}

Lock 만료 시간

기본적으로 격리 잠금은 명령이 완료된 후 만료됩니다. 또는 명령이 중단되어 완료할 수 없는 경우 잠금은 1시간 후에 만료됩니다. 그러나 명령에서 isolationLockExpiresAt 메서드를 정의하여 잠금 만료 시간을 조정할 수 있습니다.

use DateTimeInterface;
use DateInterval;
 
/**
* Determine when an isolation lock expires for the command.
*/
public function isolationLockExpiresAt(): DateTimeInterface|DateInterval
{
return now()->addMinutes(5);
}

입력 기대값 정의

콘솔 명령어를 작성할 때, 사용자가 인자 또는 옵션을 통해 입력을 수집하는 것은 일반적입니다. Laravel은 명령어의 signature 속성을 사용하여 사용자로부터 기대하는 입력을 매우 편리하게 정의할 수 있도록 해줍니다. signature 속성을 사용하면 단일하고 표현적인 라우트와 유사한 구문으로 명령어의 이름, 인자 및 옵션을 정의할 수 있습니다.

인자

사용자가 제공하는 모든 인자와 옵션은 중괄호로 묶입니다. 다음 예제에서 명령어는 user라는 필수 인자 하나를 정의합니다.

/**
* 콘솔 명령어의 이름 및 시그니처입니다.
*
* @var string
*/
protected $signature = 'mail:send {user}';

인자를 선택적으로 만들거나 인자에 대한 기본값을 정의할 수도 있습니다.

// 선택적 인자...
'mail:send {user?}'
 
// 기본값을 가진 선택적 인자...
'mail:send {user=foo}'

옵션

옵션은 인자와 마찬가지로 사용자 입력의 또 다른 형태입니다. 옵션은 명령줄을 통해 제공될 때 두 개의 하이픈(--)으로 접두사가 붙습니다. 값을 받는 옵션과 값을 받지 않는 옵션의 두 가지 유형이 있습니다. 값을 받지 않는 옵션은 부울 "스위치" 역할을 합니다. 이러한 유형의 옵션의 예제를 살펴보겠습니다.

/**
* 콘솔 명령어의 이름 및 시그니처입니다.
*
* @var string
*/
protected $signature = 'mail:send {user} {--queue}';

이 예제에서 --queue 스위치는 Artisan 명령어를 호출할 때 지정할 수 있습니다. --queue 스위치가 전달되면 옵션의 값은 true가 됩니다. 그렇지 않으면 값은 false가 됩니다.

php artisan mail:send 1 --queue

값을 가지는 옵션

다음으로, 값을 필요로 하는 옵션을 살펴보겠습니다. 사용자가 옵션에 대한 값을 반드시 지정해야 하는 경우, 옵션 이름 뒤에 = 기호를 붙여야 합니다.

/**
* 콘솔 명령어의 이름 및 서명.
*
* @var string
*/
protected $signature = 'mail:send {user} {--queue=}';

이 예시에서 사용자는 다음과 같이 옵션에 대한 값을 전달할 수 있습니다. 명령어를 호출할 때 옵션을 지정하지 않으면 해당 값은 null이 됩니다.

php artisan mail:send 1 --queue=default

옵션 이름 뒤에 기본값을 지정하여 옵션에 기본값을 할당할 수 있습니다. 사용자가 옵션 값을 전달하지 않으면 기본값이 사용됩니다.

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

옵션 단축키

옵션을 정의할 때 단축키를 할당하려면, 옵션 이름 앞에 단축키를 지정하고 | 문자를 구분 기호로 사용하여 단축키와 전체 옵션 이름을 분리할 수 있습니다.

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

터미널에서 명령어를 호출할 때 옵션 단축키는 단일 하이픈으로 시작해야 하며, 옵션 값을 지정할 때 = 문자를 포함해서는 안 됩니다.

php artisan mail:send 1 -Qdefault

입력 배열

여러 입력 값을 받을 인자 또는 옵션을 정의하려면 * 문자를 사용할 수 있습니다. 먼저, 이러한 인자를 지정하는 예시를 살펴보겠습니다.

'mail:send {user*}'

이 메서드를 호출할 때 user 인자는 명령줄에 순서대로 전달될 수 있습니다. 예를 들어, 다음 명령어는 user의 값을 12를 값으로 갖는 배열로 설정합니다.

php artisan mail:send 1 2

* 문자는 선택적 인자 정의와 결합하여 인자의 0개 이상의 인스턴스를 허용할 수 있습니다.

'mail:send {user?*}'

옵션 배열

여러 입력 값을 필요로 하는 옵션을 정의할 때, 커맨드에 전달되는 각 옵션 값은 옵션 이름으로 시작해야 합니다.

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

이러한 커맨드는 여러 --id 인자를 전달하여 호출할 수 있습니다.

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

입력 설명

콜론을 사용하여 인자 이름과 설명을 분리하여 입력 인자와 옵션에 설명을 할당할 수 있습니다. 명령어를 정의하기 위한 추가 공간이 필요한 경우 여러 줄에 걸쳐 정의할 수도 있습니다.

/**
* 콘솔 명령어의 이름 및 시그니처입니다.
*
* @var string
*/
protected $signature = 'mail:send
{user : 사용자 ID}
{--queue : 작업을 큐에 넣을지 여부}';

누락된 입력 프롬프트

명령어에 필수 인자가 포함되어 있는 경우, 해당 인자가 제공되지 않으면 사용자에게 오류 메시지가 표시됩니다. 또는 PromptsForMissingInput 인터페이스를 구현하여 필수 인자가 누락된 경우 사용자에게 자동으로 프롬프트를 표시하도록 명령어를 구성할 수 있습니다.

<?php
 
namespace App\Console\Commands;
 
use Illuminate\Console\Command;
use Illuminate\Contracts\Console\PromptsForMissingInput;
 
class SendEmails extends Command implements PromptsForMissingInput
{
/**
* 콘솔 명령어의 이름 및 시그니처입니다.
*
* @var string
*/
protected $signature = 'mail:send {user}';
 
// ...
}

Laravel이 사용자로부터 필수 인자를 수집해야 하는 경우, 인자 이름 또는 설명을 사용하여 지능적으로 질문을 구성하여 사용자에게 인자를 자동으로 요청합니다. 필수 인자를 수집하는 데 사용되는 질문을 사용자 정의하려는 경우, promptForMissingArgumentsUsing 메서드를 구현하여 인자 이름으로 키가 지정된 질문 배열을 반환할 수 있습니다.

/**
* 반환된 질문을 사용하여 누락된 입력 인자를 프롬프트합니다.
*
* @return array<string, string>
*/
protected function promptForMissingArgumentsUsing(): array
{
return [
'user' => '메일을 받을 사용자 ID는 무엇입니까?',
];
}

질문과 자리 표시자를 포함하는 튜플을 사용하여 자리 표시자 텍스트를 제공할 수도 있습니다.

return [
'user' => ['메일을 받을 사용자 ID는 무엇입니까?', '예: 123'],
];

프롬프트에 대한 완전한 제어가 필요한 경우 사용자에게 프롬프트를 표시하고 답변을 반환해야 하는 클로저를 제공할 수 있습니다.

use App\Models\User;
use function Laravel\Prompts\search;
 
// ...
 
return [
'user' => fn () => search(
label: '사용자 검색:',
placeholder: '예: Taylor Otwell',
options: fn ($value) => strlen($value) > 0
? User::where('name', 'like', "%{$value}%")->pluck('name', 'id')->all()
: []
),
];
lightbulb

포괄적인 Laravel 프롬프트 문서에는 사용 가능한 프롬프트 및 사용법에 대한 추가 정보가 포함되어 있습니다.

사용자에게 옵션을 선택하거나 입력하도록 프롬프트를 표시하려는 경우, 명령어의 handle 메서드에 프롬프트를 포함할 수 있습니다. 그러나 누락된 인자에 대한 프롬프트가 자동으로 표시된 경우에만 사용자에게 프롬프트를 표시하려면 afterPromptingForMissingArguments 메서드를 구현할 수 있습니다.

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use function Laravel\Prompts\confirm;
 
// ...
 
/**
* 사용자가 누락된 인자에 대한 프롬프트를 받은 후 작업을 수행합니다.
*/
protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output): void
{
$input->setOption('queue', confirm(
label: '메일을 큐에 넣으시겠습니까?',
default: $this->option('queue')
));
}

명령어 I/O

입력 가져오기

명령어가 실행되는 동안 명령어에 의해 허용된 인자와 옵션의 값에 액세스해야 할 수 있습니다. 이렇게 하려면 argumentoption 메서드를 사용할 수 있습니다. 인자 또는 옵션이 존재하지 않으면 null이 반환됩니다.

/**
* 콘솔 명령어를 실행합니다.
*/
public function handle(): void
{
$userId = $this->argument('user');
}

모든 인자를 array로 가져와야 하는 경우 arguments 메서드를 호출합니다.

$arguments = $this->arguments();

옵션은 option 메서드를 사용하여 인자만큼 쉽게 가져올 수 있습니다. 모든 옵션을 배열로 가져오려면 options 메서드를 호출합니다.

// 특정 옵션 가져오기...
$queueName = $this->option('queue');
 
// 모든 옵션을 배열로 가져오기...
$options = $this->options();

입력 프롬프트

lightbulb

Laravel 프롬프트는 자리 표시자 텍스트 및 유효성 검사를 포함하여 브라우저와 유사한 기능을 갖춘 명령줄 응용 프로그램에 아름답고 사용자 친화적인 양식을 추가하기 위한 PHP 패키지입니다.

출력을 표시하는 것 외에도 명령어 실행 중에 사용자에게 입력을 제공하도록 요청할 수도 있습니다. ask 메서드는 주어진 질문으로 사용자에게 프롬프트를 표시하고 입력을 받아들인 다음 사용자의 입력을 명령어에 다시 반환합니다.

/**
* 콘솔 명령어를 실행합니다.
*/
public function handle(): void
{
$name = $this->ask('이름이 무엇입니까?');
 
// ...
}

ask 메서드는 사용자 입력이 제공되지 않은 경우 반환해야 하는 기본값을 지정하는 선택적 두 번째 인자도 허용합니다.

$name = $this->ask('이름이 무엇입니까?', 'Taylor');

secret 메서드는 ask와 유사하지만 사용자가 콘솔에 입력할 때 입력 내용이 표시되지 않습니다. 이 메서드는 비밀번호와 같은 민감한 정보를 묻는 데 유용합니다.

$password = $this->secret('비밀번호는 무엇입니까?');

확인 요청

사용자에게 간단한 "예 또는 아니오" 확인을 요청해야 하는 경우 confirm 메서드를 사용할 수 있습니다. 기본적으로 이 메서드는 false를 반환합니다. 그러나 사용자가 프롬프트에 대한 응답으로 y 또는 yes를 입력하면 메서드는 true를 반환합니다.

if ($this->confirm('계속하시겠습니까?')) {
// ...
}

필요한 경우 confirm 메서드에 두 번째 인자로 true를 전달하여 확인 프롬프트가 기본적으로 true를 반환하도록 지정할 수 있습니다.

if ($this->confirm('계속하시겠습니까?', true)) {
// ...
}

자동 완성

anticipate 메서드를 사용하여 가능한 선택에 대한 자동 완성을 제공할 수 있습니다. 사용자는 자동 완성 힌트와 관계없이 여전히 모든 답변을 제공할 수 있습니다.

$name = $this->anticipate('이름이 무엇입니까?', ['Taylor', 'Dayle']);

또는 anticipate 메서드에 클로저를 두 번째 인자로 전달할 수 있습니다. 클로저는 사용자가 입력 문자를 입력할 때마다 호출됩니다. 클로저는 지금까지 사용자의 입력을 포함하는 문자열 매개변수를 허용하고 자동 완성을 위한 옵션 배열을 반환해야 합니다.

$name = $this->anticipate('주소가 무엇입니까?', function (string $input) {
// 자동 완성 옵션 반환...
});

객관식 질문

질문을 할 때 사용자에게 미리 정의된 선택 집합을 제공해야 하는 경우 choice 메서드를 사용할 수 있습니다. 옵션을 선택하지 않은 경우 반환할 기본값의 배열 인덱스를 메서드의 세 번째 인자로 전달하여 설정할 수 있습니다.

$name = $this->choice(
'이름이 무엇입니까?',
['Taylor', 'Dayle'],
$defaultIndex
);

또한 choice 메서드는 유효한 응답을 선택하기 위한 최대 시도 횟수와 여러 선택이 허용되는지 여부를 결정하기 위한 선택적 네 번째 및 다섯 번째 인자를 허용합니다.

$name = $this->choice(
'이름이 무엇입니까?',
['Taylor', 'Dayle'],
$defaultIndex,
$maxAttempts = null,
$allowMultipleSelections = false
);

출력 작성

콘솔로 출력을 보내려면 line, info, comment, question, warnerror 메서드를 사용할 수 있습니다. 이러한 각 메서드는 목적에 맞는 적절한 ANSI 색상을 사용합니다. 예를 들어 사용자에게 몇 가지 일반 정보를 표시해 보겠습니다. 일반적으로 info 메서드는 콘솔에 녹색 텍스트로 표시됩니다.

/**
* 콘솔 명령어를 실행합니다.
*/
public function handle(): void
{
// ...
 
$this->info('명령어가 성공했습니다!');
}

오류 메시지를 표시하려면 error 메서드를 사용합니다. 오류 메시지 텍스트는 일반적으로 빨간색으로 표시됩니다.

$this->error('문제가 발생했습니다!');

line 메서드를 사용하여 일반적인 색이 없는 텍스트를 표시할 수 있습니다.

$this->line('화면에 표시');

newLine 메서드를 사용하여 빈 줄을 표시할 수 있습니다.

// 빈 줄 하나 쓰기...
$this->newLine();
 
// 빈 줄 세 개 쓰기...
$this->newLine(3);

테이블

table 메서드를 사용하면 여러 행/열 데이터를 올바르게 형식화하기 쉽습니다. 열 이름과 테이블 데이터를 제공하기만 하면 Laravel에서 자동으로 테이블의 적절한 너비와 높이를 계산합니다.

use App\Models\User;
 
$this->table(
['이름', '이메일'],
User::all(['name', 'email'])->toArray()
);

진행률 표시줄

장시간 실행되는 작업의 경우 사용자에게 작업 완료 정도를 알려주는 진행률 표시줄을 표시하는 것이 유용할 수 있습니다. withProgressBar 메서드를 사용하여 Laravel은 진행률 표시줄을 표시하고 주어진 반복 가능한 값에 대한 각 반복에 대해 진행률을 진행합니다.

use App\Models\User;
 
$users = $this->withProgressBar(User::all(), function (User $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();
lightbulb

고급 옵션에 대해서는 Symfony 진행률 표시줄 컴포넌트 문서를 참조하세요.

명령어 등록

기본적으로 Laravel은 app/Console/Commands 디렉토리 내의 모든 명령어를 자동으로 등록합니다. 그러나 애플리케이션의 bootstrap/app.php 파일에서 withCommands 메서드를 사용하여 Laravel에 다른 디렉토리에 있는 Artisan 명령어를 검색하도록 지시할 수 있습니다.

->withCommands([
__DIR__.'/../app/Domain/Orders/Commands',
])

필요한 경우 명령어의 클래스 이름을 withCommands 메서드에 제공하여 명령어를 수동으로 등록할 수도 있습니다.

use App\Domain\Orders\Commands\SendEmails;
 
->withCommands([
SendEmails::class,
])

Artisan이 부팅되면 애플리케이션의 모든 명령어가 서비스 컨테이너에 의해 확인되고 Artisan에 등록됩니다.

프로그래밍 방식으로 명령어 실행

때로는 CLI 외부에서 Artisan 명령어를 실행할 수 있습니다. 예를 들어 경로 또는 컨트롤러에서 Artisan 명령어를 실행할 수 있습니다. Artisan 파사드의 call 메서드를 사용하여 이를 수행할 수 있습니다. call 메서드는 첫 번째 인자로 명령어의 시그니처 이름 또는 클래스 이름을 허용하고 두 번째 인자로 명령어 매개변수 배열을 허용합니다. 종료 코드가 반환됩니다.

use Illuminate\Support\Facades\Artisan;
 
Route::post('/user/{user}/mail', function (string $user) {
$exitCode = Artisan::call('mail:send', [
'user' => $user, '--queue' => 'default'
]);
 
// ...
});

또는 전체 Artisan 명령어를 문자열로 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]
]);
});

부울 값 전달

migrate:refresh 명령어의 --force 플래그와 같이 문자열 값을 허용하지 않는 옵션의 값을 지정해야 하는 경우 옵션 값으로 true 또는 false를 전달해야 합니다.

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

Artisan 명령어 큐에 넣기

Artisan 파사드의 queue 메서드를 사용하여 Artisan 명령어를 큐에 넣어 백그라운드에서 큐 워커에 의해 처리되도록 할 수도 있습니다. 이 메서드를 사용하기 전에 큐를 구성하고 큐 리스너를 실행하고 있는지 확인하십시오.

use Illuminate\Support\Facades\Artisan;
 
Route::post('/user/{user}/mail', function (string $user) {
Artisan::queue('mail:send', [
'user' => $user, '--queue' => 'default'
]);
 
// ...
});

onConnectiononQueue 메서드를 사용하여 Artisan 명령어를 디스패치해야 하는 연결 또는 큐를 지정할 수 있습니다.

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

다른 명령어에서 명령어 호출

때로는 기존 Artisan 명령어에서 다른 명령어를 호출할 수 있습니다. call 메서드를 사용하여 이 작업을 수행할 수 있습니다. 이 call 메서드는 명령어 이름과 명령어 인자/옵션 배열을 허용합니다.

/**
* 콘솔 명령어를 실행합니다.
*/
public function handle(): void
{
$this->call('mail:send', [
'user' => 1, '--queue' => 'default'
]);
 
// ...
}

다른 콘솔 명령어를 호출하고 모든 출력을 억제하려면 callSilently 메서드를 사용할 수 있습니다. callSilently 메서드는 call 메서드와 동일한 시그니처를 갖습니다.

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

신호 처리

아시다시피 운영 체제에서는 실행 중인 프로세스에 신호를 보낼 수 있습니다. 예를 들어 SIGTERM 신호는 운영 체제에서 프로그램을 종료하도록 요청하는 방법입니다. Artisan 콘솔 명령어에서 신호를 수신하고 신호 발생 시 코드를 실행하려면 trap 메서드를 사용할 수 있습니다.

/**
* 콘솔 명령어를 실행합니다.
*/
public function handle(): void
{
$this->trap(SIGTERM, fn () => $this->shouldKeepRunning = false);
 
while ($this->shouldKeepRunning) {
// ...
}
}

한 번에 여러 신호를 수신하려면 trap 메서드에 신호 배열을 제공할 수 있습니다.

$this->trap([SIGTERM, SIGQUIT], function (int $signal) {
$this->shouldKeepRunning = false;
 
dump($signal); // SIGTERM / SIGQUIT
});

스텁 사용자 정의

Artisan 콘솔의 make 명령어는 컨트롤러, 작업, 마이그레이션 및 테스트와 같은 다양한 클래스를 만드는 데 사용됩니다. 이러한 클래스는 입력에 따라 값이 채워지는 "스텁" 파일을 사용하여 생성됩니다. 그러나 Artisan에서 생성한 파일에 작은 변경 사항을 적용할 수 있습니다. 이를 수행하려면 stub:publish 명령어를 사용하여 가장 일반적인 스텁을 애플리케이션에 게시하여 사용자 정의할 수 있습니다.

php artisan stub:publish

게시된 스텁은 애플리케이션 루트의 stubs 디렉토리 내에 위치하게 됩니다. 이러한 스텁에 적용한 변경 사항은 Artisan의 make 명령어를 사용하여 해당 클래스를 생성할 때 반영됩니다.

이벤트

Artisan은 명령어를 실행할 때 세 가지 이벤트를 디스패치합니다: Illuminate\Console\Events\ArtisanStarting, Illuminate\Console\Events\CommandStarting, 그리고 Illuminate\Console\Events\CommandFinished. ArtisanStarting 이벤트는 Artisan이 실행을 시작하는 즉시 디스패치됩니다. 다음으로, CommandStarting 이벤트는 명령어가 실행되기 직전에 디스패치됩니다. 마지막으로, CommandFinished 이벤트는 명령어가 실행을 완료한 후 디스패치됩니다.