라라벨코리아:: 라라벨 5.2 - 업그레이드 가이드
5.1에서 5.2.0 으로 업그레이드 하기
주의: 프레임워크에 에러가 발생할만한 모든 포괄적인 목록을 제공하려고 합니다. 그렇지만 이러한 변경사항들의 대부분은 여러분의 애플리케이션에 적용되지 않을 수도 있습니다.
composer.json 파일에서 laravel/framework 5.2.*를 변경하십시오.
composer.json 파일의 require-dev 섹션에 "symfony/dom-crawler": "~3.0" 와 "symfony/css-selector": "~3.0"를 추가하십시오.
config/auth.php 설정 파일을 다음의 https://github.com/laravel/laravel/blob/638b261a68913bae9a64f6d540612b862fa3c4dd/config/auth.php와 같이 변경해야 합니다.
새로운 복사본으로 파일을 덮어씌우고, 이전 설정 파일의 옵션값을 참고하여 인증을 설정하십시오. 라라벨 5.1에서 일반적인 Eloquent 기반의 인증 서비스를 이용 중이었다면, 대부분의 값들은 동일할 것입니다.
새로운 auth.php 설정 파일안에 있는 passwords.users.email 설정 옵션의 특별한 사항를 확인하고, 뷰 파일의 경로가 애플리케이션의 실제의 뷰 파일 경로와 일치하는지 확인하십시오. 라라벨 5.2에서 이 뷰에 대한 기본 경로가 변경되었습니다. 새로운 설정 파일의 기본 값이 가지고 있는 뷰의 경로와 일치하지 않는다면 설정 옵션을 변경하십시오.
Illuminate\Contracts\Auth\Authenticatable contract를 구현하고 있었다면, 더 이상 Authenticatable trait-트레이트를 사용하지 *않기 때문에, 여러분은 contract 구현 클래스에 getAuthIdentifierName 메소드를 추가해야만 합니다. 일반적으로 이 메소드는 인증 엔티티의 "primary key" 컬럼 이름을 반환할 것입니다. 예를 들면 id와 같습니다.
이 인터페이스를 구현하지 않았었다면, 애플리케이션에 영향을 미치지 않을 수 있습니다.
사용자를 식별하기 위한 사용자 정의 메소드를 정의하는데 Auth::extend 메소드를 사용하고 있었다면, 이제 사용자 정의 User 프로바이더를 정의하기 위해서 Auth::provider 를 사용해야 합니다. 사용자 정의 프로바이더를 정의하고 나서, 새로운 auth.php 설정 파일의 providers 배열 안에 이를 설정해야 합니다.
사용자 정의 인증 프로바이더에 대한 보다 자세한 내용은 인증 문서를 참고하십시오.
Illuminate\Foundation\Auth\AuthenticatesUsers의 loginPath() 메소드가 제거되었기 때문에, AuthController 에서 $loginPath 변수는 더이상 필요하지 않습니다. 기본적으로, 트레이트-trait 은 인증에서 에러가 발생하면 자동으로 사용자를 이전 위치로 리다이렉트 시킬 것입니다.
승인-Authorization
Illuminate\Auth\Access\UnauthorizedException이 Illuminate\Auth\Access\AuthorizationException으로 이름이 변경되었습니다. 이 exception 을 수동으로 처리하도록 하지 않았었다면, 애플리케이션에 영향을 미치지 않을 수 있습니다.
Eloquent 베이스 컬렉션
Eloquent 컬렉션 인스턴스는 이제, 다음 메소드: pluck, keys, zip, collapse, flatten, flip를 위한 베이스 컬렉션 (Illuminate\Support\Collection)을 반환합니다.
키값의 유지
slice, chunk, and reverse 메소드들은 이제 컬렉션의 키 값을 유지합니다. 이 메소드들이 키를 유지하는 것을 원하지 않는다면, Collection 인스턴스의 values 메소드를 사용하십시오.
컴포저 클래스
Illuminate\Foundation\Composer 클래스는 Illuminate\Support\Composer으로 이동되었습니다. 수동으로 이 클래스를 사용하지 않았었다면, 애플리케이션에 영향을 미치지 않을 수 있습니다.
명령어와 핸들러
Self-Handling 명령어
jobs / commands 클래스에서 더이상 SelfHandling contract를 구현할 필요가 없습니다. 모든 job 클래스는 기본적으로 self-handling 되며, 여러분의 클래스들에서 이 이터페이스를 제거할 수 있습니다.
명령과 핸들러의 구분
라라벨 5.2 command bus 는 혼자서 처리되는 명령어만 지원하며 더이상 명령어와 핸들러를 구분하는 것을 지원을 하지 않습니다.
별도의 명령어와 핸들러를 계속 사용하고 싶은 경우에는, 이에 대한 하위 호환성을 지원하는 라라벨 Collective 패키지를 설치 할 수 있습니다. https://github.com/LaravelCollective/bus
구동환경 변수값
app.php 설정 파일의 env 설정 옵션값이 다음과 같이 추가되었습니다.
캐싱과 Env
배포 진행중에 config:cache명령어를 사용한다면, 여러분은 반드시 애플리케이션의 다른 곳이 아닌, 설정 파일 안에서만 env 함수를 호출 하는 것을 확인해야 합니다.
만약 애플리케이션에서 env 를 호출한다면, 여러분의 설정 파일에 해당 설정 값을 추가하고, 해당 위치에서는 env 를 호출하도록 하여 env 가 config를 호출하도록 변경할 것을 강력하게 권고합니다.
컴파일된 클래스들
존재하는 경우에는 config/compile.php 안에 있는 files 배열안에서 다음 라인들을 제거하십시오:
이렇게 하지 않으면 php artisan optimize가 실행될 때 서비스 프로바이더가 존재하지 않는다고 에러가 발생합니다.
CSRF 확인
단위 테스트가 실행중에 더이상 CSRF 확인이 자동으로 수행되지 않습니다. 이 변경사항은 애플리케이션에는 영향을 미치지 않을 수 있습니다.
MySQL 날짜지원
MySQL 5.7 에서 부터는 기본적으로 stric 모드가 사용되기 때문에, 0000-00-00 00:00:00 가 더이상 유효한 날짜로 인식되지 않습니다. 데이터베이스에 레코드를 추가할 때 모든 타임스탬프 컬럼은 유효한 기본값을 받아야 합니다. 여러분은 마이그레이션 파일에서 useCurrent 메소드를 사용하여 타임스탬프 컬럼에 현재의 타임스탬프 값을 기본으로 지정하거나, null 값을 허용하도록 nullable 로 만들 수 있습니다:
MySQL JSON 컬럼 타입
이제 MySQL 드라이버를 사용할 때, json 컬럼 타입은 실제 JSON 컬럼을 생성합니다. MySQL 5.7 이상을 구동하지 않는다면, 이 컬럼 타입은 사용이 불가능합니다. 대신에 마이그레이션 파일에서 text 컬럼 타입을 사용하십시오.
이제 데이터베이스 시딩이 실행될 때, 모든 Eloquent 모델은 기본적으로 모든 속성이 바로 접근할 수 있습니다. 이전까지는 Model::unguard()를 호출해야만 했습니다. 시딩이 진행되는 동안 속성들을 보호하고자(guard) 한다면, DatabaseSeeder 클래스의 상단 부분에서 Model::reguard()를 호출할 수 있습니다.
모델의 $casts 속성에 추가된 date 나 datetime 과 같은 속성들은 모델이나 모델의 컬렉션에서 toArray가 호출될 때 문자로 변환될 것입니다. 이를 통해서 $dates 배열에 지정된 날짜와 일치하는 날짜 캐스팅 변환이 됩니다.
글로벌 스코프 구현이 보다 손쉽게 사용될 수 있도록 재작성되었습니다. 글로벌 스코프는 더이상 remove 메소드가 필요하지 않으며, 여러분이 작성한 글로벌 스코프에서 제거할 수 있습니다.
Eloquent 쿼리 빌더에서 쿼리 빌더 인스턴스에 엑세스 하고자 getQueyt를 호출하였었다면, 이제 toBase 메소드를 호출해야 합니다.
어떤 이유던지 remove 메소드를 직접 호출했었다면, 이를 $eloquentBuilder->withoutGlobalScope($scope)을 호출하도록 변경해야 합니다.
Eloquent 쿼리 빌더에 새로운 withoutGlobalScope 와 withoutGlobalScopes 메소드가 추가되었습니다. $model->removeGlobalScopes($builder)의 호출은 간단하게 $builder->withoutGlobalScopes()으로 변경할 수 있습니다.
Primary kyes
기본적으로 Eloquent는 여러분의 primary key 가 정수형이라고 추정하여 자동으로 정수 타입으로 캐스팅 할 것입니다. 정수형이 아닌 primary key를 사용한다면, Eloquent 모델의 $incrementing 속성을 false 로 오버라이딩 해야합니다:
코어 이벤트 객체들
이제 라라벨에 의해서 발생하는 몇몇 코어 이벤트들은 이벤트 이름과 동적 파라미터 문자열 대신에 이벤트 객체를 사용합니다. 다음은 이전의 이벤트 이름과 새로운 객체의 대응 목록입니다 :
각각의 이 이벤트 객체들은 라라벨 5.1의 이벤트 핸들러에 전달 되었던 파라미터들과 완전히 동일한 파라미터를 가지고 있습니다. 예를 들어 5.1. 에서 DB::listen 을 사용중이었다면, 5.2. 에서는 다음과 같이 변경할 수 있습니다:
각각의 새로운 이벤트 객체 클래스를 살펴보고, 각각의 프로퍼티들을 확인하십시오.
App\Exceptions\Handler 클래스의 $dontReport 속성은 다음과 같은 exception 타입들을 포함하도록 수정되어야 합니다:
이제 url() 헬퍼 함수는 경로를 지정하지 않으면 Illuminate\Routing\UrlGenerator 인스턴스를 반환합니다.
라라벨 5.2에서는 자동으로 URI의 식별자를 기반으로 라우트와 컨트롤러에 모델 인스턴스를 주입해주는 편리한 기능을 제공하는 "묵시적 모델 바인딩"이 도입되었습니다. 하지만, 이러한 변경사항은 라우트나 컨트롤러에서 사용된 타입힌트 모델 인스턴스의 동작을 변경하게 됩니다.
타입-힌트되는 모델 인스턴스가 여러분의 라우트 또는 컨트롤러에 있고, 비어있는모델 인스턴스가 주입되도록 구성하였었다면, 라우트나 컨트롤러에서 이 타입-힌트를 제거하고, 빈 모델 인스턴스를 직접 생성해야 합니다. 다시말해 라라벨은 URI의 식별자를 기반으로 데이터베이스에 존재하는 모델 인스턴스를 찾으려고 시도할 것입니다.
IronMQ 큐 드라이버가 별도의 고유 패키지로 이동되었으며, 코어 프레임워크에서 더이상 제공되지 않습니다.
이제 php artisan make:job 명령어는 기본적으로 "queued-큐를 통해서 처리되는" job 클래스를 생성합니다. "sync-동기적으로 처리되는" job을 생성하고자 한다면, 명령어를 실행할 때 --sync 옵션을 사용하십시오.
pretend 메일 설정 옵션은 제거되었습니다. 대신에, pretent 함수와 동일한 역활을 수행하며 메일 메시지에 대한 보다 많은 정보를 기록하는, log 메일 드라이버를 사용하십시오.
프레임워크에서 생성되는 다른 URL들과 동일한 URL을 생성하기 위해서 paginator URL은 더이상 마지막에 슬래쉬(/)를 포함하지 않습니다. 이 수정사항은 애플리케이션에 영향을 미치지 않을 수 있습니다.
app.php 설정 파일의 서비스 프로바이더 부분에서 Illuminate\Foundation\Providers\ArtisanServiceProvider가 제거되어 졌어야합니다.
app.php 설정 파일의 서비스 프로바이더 부분에서 Illuminate\Routing\ControllerServiceProvider가 제거되어 졌어야 합니다.
인증 시스템의 변경으로 인해서, 라라벨 5.2로 업그레이드 하면 기존에 존재하던 세션들은 모두 유효하지 않게 됩니다.
데이터베이스 세션 드라이버
사용자의 ID, IP, 그리고 user-agent와 같은 보다 자세한 사용자 정보를 포함하는 새로운 database 세션 드라이버가 프레임워크에 새롭게 작성되었습니다. 기존의 드라이버를 계속 사용하고자 한다면, session.php 설정 파일에서 legacy-database 드라이버를 사용하십시오.
새로운 드라이버를 사용하고자 한다면, 세션 데이터베이스 테이블에 user_id (nullable integer), ip_address (nullable string), 그리고 user_agent (text) 컬럼을 추가해야만 합니다.
프레임워크에 "Stringy" 라이브러리가 더이상 포함되지 않습니다. 애플리케이션에서 이를 사용하려면 Composer를 통해서 수동으로 설치하면 됩니다.
Exception 타입들
ValidatesRequests 트레이트-trait은 이제 Illuminate\Http\Exception\HttpResponseException 인스턴스 대신 Illuminate\Foundation\Validation\ValidationException 인스턴스를 예외로 던집니다. 이 exception을 수동으로 처리하지 않았었다면 애플리케이션에 영향을 끼치지 않을 수 있습니다.
비추천 사항들
다음의 기능들은 5.2에서 사용을 권장하지 않는 기능들이 되었으며, 2016년 6월에 릴리즈되는 5.3에서는 제거될것입니다.
Illuminate\Contracts\Bus\SelfHandling contract 는 job 에서 삭제될 수 있습니다.
컬렉션, 쿼리빌더 그리고 Eloquent 쿼리 빌더 객체에서 lists 메소드는 pluck으로 이름이 변경되었습니다. 메소드의 사용법은 동일합니다.
Route::controller를 사용한 묵시적 컨트롤러 라우트는 사용을 권장하지 않게 되었습니다. 라우트 파일에서 명시적으로 라우트를 등록하십시오. 이 기능은 아마도 별도 패키지로 분리될 것입니다.
get, post 그리고 다른 라우트 핼퍼 함수들은 제거되었습니다. 대신에 Route 파사드를 사용할 수 있습니다.
5.1의 database 세션 드라이버는 legacy-database으로 이름이 변경되었으며, 나중에는 제거될것입니다. 보다 자세한 내용은 "데이터베이스 세션 드라이버" 부분을 참고하십시오.
random_bytes 네이티브 PHP 함수가 사용되도록 Str::randomBytes 함수는 더이상 사용을 권장하지 않습니다.
hash_equals 네이티브 PHP 함수가 사용되도록 Str::equals 함수는 더이상 사용을 권장하지 않습니다.
Illuminate\Support\HtmlString 가 사용되도록 Illuminate\View\Expression는 더이상 사용을 권장하지 않습니다.
WincacheStore 캐시 드라이버는 제거되었습니다.
마찬가지로 base form request 클래스에서 formatErrors 메소드를 오버라이드 했었다면, Illuminate\Validation\Validator 인스턴스 대신에 Illuminate\Contracts\Validation\Validator contract 를 타입힌트 해야 합니다.
만약 SQLite 데이터베이스에서 컬럼 이름을 변경하거나, 컬럼을 삭제하는 마이그레이션을 가지고 있다면, 터미널에서 composer.json 파일에 doctrine/dbal 의존성을 추가하고 composer update 명령어를 실행할 필요가 있습니다.
PHP 5.4 이상