소개


아티즌(Artisan)은 Laravel 에 포함된 커맨드라인 인터페이스(cli)의 이름이다.

어플리케이션 개발시 유용한 명령어들을 제공하며, 강력한 Symfony Console 컴포넌트로부터 구동된다.

Artisan 이 제공하는 모든 명령어를 보려면, list 명령어를 사용한다.


$ php artisan list
cs


또한 모든 명령어 앞에 help 를 함께 사용하면, 명령어의 이용 가능한 매개변수와 옵션이 출력되는 "도움말" 화면을 볼 수 있다.


$ php artisan help migrate
cs



명령어 만들기


아티즌에서 제공되는 명령어 외에도, 어플리케이션에서 작동할 사용자 정의 명령어를 만들 수 있다.

사용자 정의 명령어는 app/Console/Commands 디렉토리에 저장된다.

하지만 이 명령어들은 composer.json 세팅에 기반하여 오토로드 되기 때문에, 저장 위치는 변경할 수 있다.


새로운 명령어를 생성하려면 make:console 명령을 사용한다.


$ php artisan make:console SendEmails
cs


위 예제는 app/Console/Commands/SendEmails.php 클래스를 생성할 것이다.

명령어 생성시에 --command 옵션을 사용하면 터미널 명령어 이름을 할당할 수 있다.


$ php artisan make:console SendEmails --command=emails:send
cs



명령어 구조


사용자 정의 명령어가 생성되면, list 화면에서 다른 명령어들 처럼 보여질, signature description 프로퍼티를 작성해야 한다.

handle 메소드는 명령어가 실행될 때 호출될 것이며, 이 메소드에 어떤 명령 로직이든 배치할 수 있다.

우리는 명령의 생성자에 필요한 어떤 의존 라이브러리든 삽입할 수 있다.

Laravel 서비스 컨테이너는 생성자에 모든 의존 라이브러리 타입 힌트를 자동으로 삽입할 것이다.

방대한 코드의 재사용시, 콘솔 명령이 수행되기 위해 어플리케이션 서비스를 연기하는 것이 좋다.


$ vi app/ConsoleCommands/SendEmails.php

...
class SendEmails extends Command
{
    protected $signature = 'email:send';
    protected $description = 'Command description';
 
    public function __construct()
    {
        parent::__construct();
    }
 
    public function handle()
    {
        //
    }
}
cs



명령어 I/O


입력받을 요소(Input) 정의


콘솔 명령을 사용할 때, 매개변수나 옵션을 사용자로부터 입력받는 것이 일반적이다.

명령어의 signature 프로퍼티를 사용하여 원하는대로 입력을 받을 수 있다.

signature 프로퍼티에서 single, expressive, route 문법으로 명령어의 이름, 매개변수, 옵션들을 정의할 수 있다.

모든 매개변수와 옵션들은 중괄호로 감싼다.

다음 예제에서 명령어는 하나의 매개변수 user 를 요구하도록 정의한다.


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


아래는 매개변수를 선택적으로 하거나, 매개변수 기본 값을 정의하는 예제이다.


email:send {user?}
email:send {user=foo}
cs


매개변수와 비슷한 옵션도 사용자 입력 형태이다.

옵션은 커맨드 라인에서 지정될 때, 2개의 하이픈(--)이 접두어로 붙는다.


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


위 예제에서, --queue 옵션은 아티즌 명령어를 호출할 때 지정될 수 있다.

--queue 옵션을 지정하면, 옵션 값은 true 가 되고, 아니면 false 가 된다.


$ php artisan email:send 1 --queue
cs


옵션 이름 뒤에 접미어로 equal 기호(=)를 붙여 옵션에 값을 받을 수도 있다.


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


이 경우, user 는 아래처럼 옵션에 값을 전달할 것이다.


$ php artisan email:send 1 --queue=default
cs


옵션을 정의할 때 단축어를 할당하려면, 옵션 이름 앞에 지정하고, 옵션 이름과 단축어를 구분하는 | 구분자를 사용한다.


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


매개변수나 옵션에 배열을 입력받고 싶다면, * 문자를 사용한다.


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


입력 매개변수나 옵션에 콜론(:)을 사용하여 부연 설명을 작성할 수 있다.



입력값 조회


명령어가 실행되는 동안, 입력받은 매개변수나 옵션 값에 접근하기 위해, argument option 메소드를 사용할 수 있다.


public function handle()
{
    $userId = $this->argument('user');
    $queueName = $this->option('queue');
}
cs


모든 매개변수나 옵션을 배열로 조회하려면 argument 와 option 메소드를 매개변수 없이 호출한다.


$arguments = $this->argument();
$options = $this->option();
cs



입력 프롬프트


명령이 실행되는 동안 입력을 받기 위해 사용자에게 질의도 할 수 있다.

ask 메소드는 사용자에게 질의하고, 입력을 받고, 받은 입력을 처리할 수 있다.


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


secret 메소드는 ask 와 유사하지만, 사용자의 입력이 콘솔에 보이지 않아서 비밀번호 같은 민감한 정보를 요청할 때 유용하다.


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



 * 확인 요청


사용자에게 간단한 확인이 필요할 때, confirm 메소드를 사용할 수 있다.

기본적으로 이 메소드는 false 를 반환할 것이지만, 사용자가 y(yes) 로 응답한다면 true(1) 를 반환할 것이다.


if ($this->confirm('Do you wish to continue? [y|N]')) {
    //
}
cs



 * 선택 요청


anticipate 메소드는 사용자가 할 수 있는 선택에 대해 자동완성을 제공한다.

자동완성 힌트와 상관없이 어떤 응답이든 선택할 수 있다.


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


선택할 항목을 미리 정의하려면, choice 메소드를 사용할 수 있다.

사용자가 인덱스로 응답 순서를 선택하거나 값을 입력할 수 있으며, 아무것도 선택하지 않을 때 기본 값을 지정할 수 있다.


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



출력 작성


콘솔에 출력을 보내려면, line, info, comment, question, error 메소드들을 사용한다.

이 메소드들은 각각 용도에 따라 적당한 ANSI 컬러를 사용할 것이다.


사용자에게 information 메시지를 출력하려면 info 메소드를 사용한다. (green색)


public function handle()
{
    $this->info('Display this on the screen');
}
cs


error 메시지를 출력하려면, error 메소드를 사용한다. (red)


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


평문은 line 메소드를 사용한다. (기본 색)


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



테이블 레이아웃


table 메소드는 데이터의 여러 행/열 형식을 간단하게 만들어 준다.

메소드에 헤더와 행만 전달하면 되며, 가로/세로 길이는 데이터에 따라 동적으로 계산된다.


$headers = ['Name''Email'];
$users = App\User::all(['name''email'])->toArray();
$this->table($headers$users);
cs



진행 바


오래 걸리는 작업의 경우, 진행 과정을 보여주는 것이 유용할 수 있다.

output 객체를 사용하여 진행 바를 시작/진행/중지 할 수 있다.

진행을 시작할 때, 각 진행 단계의 수를 정의해야 한다.


$users = App\User::all();
 
$bar = $this->output->createProgressBar(count($users));
 
foreach ($users as $user) {
    $this->performTask($user);
    $bar->advance();
}
 
$bar->finish();
cs



명령어 등록


명령어 작성이 끝났다면, 사용이 가능하도록 아티즌에 등록해야 한다.

등록은 app/Console/Kernel.php 파일의 commands 프로퍼티에 클래스 이름만 추가하면 된다.

아티즌이 구동될 때, commands 프로퍼티의 모든 명령어들은 서비스 컨테이너로부터 분석되고 아티즌에 등록될 것이다.


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



코드로 명령어 호출


cli 환경이 아닌 라우트나 컨트롤러에서, Artisan 파서드에 call 메소드를 사용하여 아티즌 명령어를 실행할 수도 있다.

call 메소드의 첫번째 매개변수로 명령어 이름을 사용하고, 두번째 매개변수로 파라미터를 배열로 사용한다.

종료 코드가 반환될 것이다.


Route::get('/foo'function () {
    $exitCode = Artisan::call('email:send', [
        'user' => 1'--queue' => 'default'
    ]);
});
cs


Artisan 파서드에 queue 메소드를 사용하면, 큐 워커로부터 백그라운드로 진행된다.


Route::get('/foo'function () {
    Artisan::queue('email:send', [
        'user' => 1'--queue' => 'default'
    ]);
});
cs


migrate:refresh 명령어의 --force 플래그 처럼, 문자열 값을 허용하지 않는 옵션 값을 지정하려면, true 나 false 를 설정한다.


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



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


기존 아티즌 명령어에서 다른 명령어를 호출하려면, 명령어 이름과 파라미터의 배열을 가지는 call 메소드를 사용한다.


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


또 다른 콘솔 명령어를 호출하고 그 모든 출력을 막으려면, call 메소드와 동일한 형식의 callSilent 메소드를 사용한다.


$this->callSilent('email:send', [
    'user' => 1'--queue' => 'default'
]);
cs



WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,