'Programming/Laravel'에 해당하는 글 3건

소개


아티즌(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
손가락귀신
정신 못차리면, 벌 받는다.

,

Laravel 프레임워크의 모든 설정 파일은 config 디렉토리에 있다.



설정 값에 접근


설정 값은 글로벌 헬퍼 함수인 config 를 사용하여 어플리케이션 어디에서든 접근할 수 있다.

설정 값은 config 디렉토리의 파일 이름과 접근을 원하는 옵션을 .(dot) 으로 연결하여 접근한다.

해당 옵션이 존재하지 않으면 기본값으로 지정되고 반환될 것이다.


/config/app.php 의 timezone 설정 값을 가져오는 예제


$value = config('app.timezone');
cs


/config/app.php 의 timezone 설정 값을 배열로 세팅하는 예제


config(['app.timezone' => 'America/Chicago']);
cs



환경 설정


어플리케이션이 실행되는 환경에 따라 각각의 설정 값을 가지는 것이 좋다.

예를 들어, 로컬 개발 서버에 실제 제품(Production) 서버와 다른 캐시 드라이버를 사용할 수 있는데,

Vance Lucas 의 DotEnv PHP 라이브러리를 이용하여, 각 환경설정 세팅을 간단히 할 수 있다.

Laravel 을 설치하면 어플리케이션의 루트 디렉토리에 .env 파일이 포함되며, 없는 경우 .env.example 파일로 복사한다.


.env 파일의 모든 변수는 어플리케이션이 요청 받을 때, 슈퍼 전역변수 $_ENV 에 로드된다.

하지만 이 변수들을 조회할 때 $_ENV 가 아닌 env 헬퍼 함수를 사용할 것이다.

config 디렉토리의 Laravel 설정 파일을 살펴보면, env 헬퍼를 이미 여러 옵션에 사용한 것을 알 수 있다.


'debug' => env('APP_DEBUG'false),
cs


env 함수에 전달된 두번째 값은 기본값이다.

주어진 키의 환경 변수가 존재하지 않으면 기본값이 사용된다.


Laravel 어플리케이션을 사용하는 개발자나 서버가 각기 다른 환경 설정이 필요할 수 있으므로, 소스 관리시 .env 파일을 커밋하지 않아야 한다.

팀으로 개발 중이라면, 어플리케이션에 .env.example 파일을 계속 포함하여, 팀의 다른 개발자들이 어플리케이션 실행에 필요한 환경 변수들을 확인할 수 있다.


어플리케이션을 구동하기 전에 APP_ENV 환경 변수를 세팅하면, Laravel 은 그 환경에 맞게 파일들을 로드하려고 할 것이다.

만약 PHPUnit 설정 파일이 APP_ENV 변수를 testing 으로 세팅하면, Laravel 은 .env.testing 파일을 로드할 것이다.

파일이 존재하지 않으면 기본적으로 .env 파일을 로드한다.



현재 환경 결정


현재 어플리케이션 환경은 .env 파일의 APP_ENV 변수를 통해 결정된다.

App 퍼사드의 environment 메소드를 통해 이 값에 접근할 수 있다.


* 퍼사드(facade) 패턴 : 퍼사드는 클래스 라이브러리에 대한 간략한 인터페이스를 제공하는 객체이다.


$environment = App::environment();
cs


환경과 주어진 값이 일치하는지 확인하기 위해 environment 메소드에 하나 이상의 매개변수를 전달할 수 있다.

이 매개변수 중 하나와 환경이 일치할 경우, 이 메소드는 true 를 반환할 것이다.


if (App::environment('local')) {
    // The environment is local
}
 
if (App::environment('local''staging')) {
    // The environment is either local OR staging...
}
cs


environment 메소드는 app 헬퍼 메소드를 통해서도 접근될 수 있다.


$environment = app()->environment();
cs



캐싱 설정


어플리케이션의 속도를 더 높이려면, Artisan 명령인 config:cache 를 사용하여 하나의 파일에 모든 설정 파일들을 캐시할 수 있다.

어플리케이션의 모든 설정 옵션들은 프레임워크로부터 빠르게 로드될 하나의 파일에 합쳐질 것이다.

일반적으로 실제 제품 서버에 배포할 때, php artisan config:cache 명령을 실행할 것이다.

로컬 개발 중에는 종종 설정 옵션을 변경하므로, 캐시를 사용하지 말아야 한다.


$ php artisan config:cache
cs



유지보수 모드


어플리케이션이 유지보수 중일 때, 어플리케이션의 모든 요청에 대해서 특정 화면을 보여줄 것이다.

업데이트 중이거나 유지보수 중일 때는 어플리케이션을 "disable" 로 간단히 사용 중지시킬 수 있다.

유지보수 모드 확인은 어플리케이션의 기본 미들웨어 스택에 포함되어 있다.

만약 어플리케이션이 유지보수 모드라면, HttpException 은 HTTP 503 상태 코드를 보여줄 것이다.


유지보수 모드로 사용하려면, down Artisan 명령어를 실행한다.


$ php artisan down
cs


유지보수 모드를 사용하지 않으려면, up 명령어를 실행한다.


$ php artisan up
cs



유지보수 모드 응답 템플릿


유지보수 모드 응답의 기본 템플릿은 resources/views/errors/503.blade.php 이다.

이 뷰는 어플리케이션에서 원하는대로 수정할 수 있다.



유지보수 모드와 큐


유지보수 모드일 때, 큐 작업은 동작하지 않는다.

이 작업은 유지보수 모드가 끝날 때 정상적으로 처리될 것이다.



유지보수 모드 대안


유지보수 모드는 몇 초 동안 작동 시간이 필요하기 때문에, 즉시 배포할 수 있는 Envoyer 같은 대안을 생각해야 한다.




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

,

현재 Laravel 버전 : 5.2



서버 요구사항


    • PHP 5.5.9 이상
    • PHP OpenSSL
    • PHP PDO
    • PHP Mbstring
    • PHP Tokenizer


Laravel 프레임워크는 위와 같은 시스템 환경을 요구하지만, 로컬에서 작업한다면 가상 머신인 Laravel Homestead 를 설치하여 사용할 수 있다.



설치


Laravel 은 종속성 관리도구로 Composer 를 이용하므로, 서버에 Composer 가 설치되어 있어야 한다.

http://getcomposer.org/



Via Laravel Installer


Laravel 을 꾸준히 사용할 경우 인스톨러를 설치해 놓는게 편하므로, 컴포저를 이용하여 Laravel 인스톨러를 다운받는다.


composer global require "laravel/installer"
cs


Laravel installer 로 설치된 Laravel 실행 파일은 ~/.composer/vendor/bin 디렉토리(또는 이에 상응하는 디렉토리)에 설치되고,

Laravel 명령이 시스템 어디서든 실행 가능하도록 Path 환경변수에 ~/.composer/vendor/bin 디렉토리를 추가해야 한다.

이제 간단히 laravel new 명령으로 Laravel 프로젝트를 생성할 수 있다.


laravel new blog
cs


위 예제처럼 명령하면 현재 디렉토리에 blog 디렉토리를 만들고 그 안에 laravel 프로젝트를 생성한다.



Via Composer Create-Project


Laravel 을 여러번 사용할 필요가 없다면, 아래처럼 컴포저의 create-project 명령을 사용하여 즉시 프로젝트를 생성한다.

위 예제처럼 blog 디렉토리에 laravel 프로젝트를 생성한다.


composer create-project --prefer-dist laravel/laravel blog
cs



설정


Laravel 의 모든 설정 파일들은 config 디렉토리에 저장된다.

각 파일에 사용 가능한 옵션들이 주석으로 문서화 되어 있으므로 참고한다.



디렉토리 권한


Laravel 설치 후에, storage 디렉토리와 bootstrap/cache 디렉토리의 서브디렉토리들이 웹서버에서 쓰기가 가능하도록 권한이 설정되어 있지 않으면 Laravel 을 실행할 수 없다. 

Homestead 가상 머신에는 이 디렉토리에 대한 권한이 이미 부여되어 있다.



어플리케이션 키


Laravel 어플리케이션에서는 사용자 세션과 암호화된 데이터들을 위해 32자 랜덤 문자열의 어플리케이션 키를 생성한다.

.env 파일에 설정되며, .env 파일이 없다면 .env.example 파일을 복사하여 생성한다.

어플리케이션 키가 설정되어 있지 않으면 아래의 명령으로 설정한다.


$ php artisan key:generate
cs



추가 설정


Laravel 은 이 외에 다른 설정들이 거의 필요하지 않으므로, 바로 개발을 시작할 수 있지만,

어플리케이션에 필요한 timzone 이나 locale 같은 다양한 옵션들이 포함되어 있는 config/app.php 파일을 확인하도록 한다.

또한 Cache, Database, Session 등의 Laravel 컴포넌트등의 설정도 필요할 것이다.



위 환경들이 정상적으로 설정되었다면 다음과 같이 Laravel 화면을 확인할 수 있다.

http://localhost






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

,