업그레이드 가이드

5.6에서 5.7.0 으로 업그레이드 하기

업그레이드 예상 시간 : 약 10-15분

{note} 가능한 모든 변경 내용을 기록하려고 했습니만, 변경 사항 중 일부는 프레임워크의 명확하지 않은 부분에서 이루어 지기 때문에 이중 일부가 실제 애플리케이션에 영향을 끼칠 수도 있습니다.

의존성 업데이트

composer.json 파일에 있는 laravel/framework 의존성을 5.7.*으로 업데이트합니다.

만약 Laravel Passport를 사용하고 있다면 composer.json 파일에 있는 laravel/passport의 의존성을 ^7.0으로 업데이트 합니다

그리고 애플리케이션에서 사용하는 써드파티 패키지를 확인하고 라라벨 5.7를 지원하는 적절한 버전을 사용하고 있는지 확인하십시오.

어플리케이션

register 메소드

영향 가능성 : 매우 낮음

Illuminate\Foundation\Application 클래스의 register 메소드의 사용되지 않는 options 인자는 제거되었습니다. 이 메소드를 재정의하는 경우 메소드를 업데이트해야합니다.

/**
 * Register a service provider with the application.
 *
 * @param  \Illuminate\Support\ServiceProvider|string  $provider
 * @param  bool   $force
 * @return \Illuminate\Support\ServiceProvider
 */
public function register($provider, $force = false);

Artisan

예약된 Job Connection 과 Queues

영향 가능성 : 낮음

$schedule->job 메소드는 이제 커넥션과 작업이 명시적으로 job 메소드로 전달되지 않으면 작업 클래스의 queueconnection 속성을 우선합니다.

일반적으로 이것은 버그 수정으로 봐야하지만 주의해야 하는 변경사항으로 분류됩니다. 이 변경과 관련하여 문제가 발생하면 알려주십시오.

Assets

Asset 디렉토리의 병합

영향 가능성 : 없음

새로운 Laravel 5.7의 경우, 스크립트 및 스타일이 포함 된 assets 디렉토리가 resources 디렉토리로 병합되었습니다. 이것은 기존의 어플리케이션에 영향을 주지 않으며 기존 어플리케이션을 변경할 필요가 없습니다.

그러나 이 변경을 반영하기를 원한다면 resources/assets/* 디렉토리에 있는 모든 파일을 한 레벨 위로 이동해야합니다 :

  • resources/assets/js/* 에서 resources/js/* 으로 이동
  • resources/assets/sass/* 에서 resources/sass/* 으로 이동

그런 다음 webpack.mix.js 파일에서 이전 디렉토리에 대한 경로를 업데이트하십시오.

mix.js('resources/js/app.js', 'public/js')
   .sass('resources/sass/app.scss', 'public/css');

svg 디렉토리 추가

영향 가능성 : 매우 높음

public 디렉토리 안에 새로운 svg 디렉토리가 추가되었습니다. 403.svg, 404.svg, 500.svg, 503.svg 의 네가지 파일이 들어 있다면, 이 파일들이 에러 페이지를 구성하는데 사용됩니다.

이 파일들은 Github에서 확인할 수 있습니다.

인증(Authentication)

Authenticate 미들웨어

영향 가능성 : 낮음

Illuminate\Auth\Middleware\Authenticate 미들웨어의 authenticate 메소드는 $request 를 첫 번째 인수로 받도록 업데이트되었습니다. 자신의 Authenticate 미들웨어에서 이 메소드를 재정의한다면, 미들웨어를 업데이트해야합니다 :

/**
 * Determine if the user is logged in to any of the given guards.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  array  $guards
 * @return void
 *
 * @throws \Illuminate\Auth\AuthenticationException
 */
protected function authenticate($request, array $guards)

ResetsPasswords Trait

영향 가능성 : 낮음

ResetsPasswords Trait의 protected sendResetResponse 메소드는 Illuminate\Http\Request 를 첫 번째 인수로 받습니다. 이 메소드를 재정의하는 경우 메소드를 업데이트해야합니다.

/**
 * Get the response for a successful password reset.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  string  $response
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
 */
protected function sendResetResponse(Request $request, $response)

SendsPasswordResetEmails Trait

영향 가능성 : 낮음

SendsPasswordResetEmails Trait의 protected sendResetLinkResponse 메소드는 Illuminate\Http\Request 를 첫 번째 인수로 받습니다. 이 메소드를 재정의하는 경우 메소드를 업데이트해야합니다.

/**
 * Get the response for a successful password reset link.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  string  $response
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse
 */
protected function sendResetLinkResponse(Request $request, $response)

권한 부여(Authorization)

Gate Contract

영향 가능성 : 매우 낮음

raw 메소드는 protected 에서 public 으로 변경되었습니다. 또한 IlluminateContractsAuthAccessGate Contract 에 추가되었습니다.

/**
 * Get the raw result from the authorization callback.
 *
 * @param  string  $ability
 * @param  array|mixed  $arguments
 * @return mixed
 */
public function raw($ability, $arguments = []);

만약 이 인터페이스를 구현하는 경우 이 메소드를 구현체에 추가해야합니다.

Login 이벤트

영향 가능성 : 매우 낮음

Illuminate\Auth\Events\Login 이벤트의 __construct 메소드는 $guard를 새로운 인자로 가집니다.

/**
 * Create a new event instance.
 *
 * @param  string  $guard
 * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
 * @param  bool  $remember
 * @return void
 */
public function __construct($guard, $user, $remember)

어플리케이션에서 이 이벤트를 수동으로 전달한다면, 이벤트의 생성자에 새로운 인수를 추가해야 합니다. 다음은 기본 프레임워크 가드를 전달하는 로그인 이벤트의 예제입니다.

use Illuminate\Auth\Events\Login;

event(new Login(config('auth.defaults.guard'), $user, $remember))

블레이드

or 연산자

영향 가능성 : 높음

Blade "or" 연산자는 같은 목적과 기능을 가진 PHP의 내장 된 ?? "null coalesce" 연산자를 위해 제거되었습니다 :

// Laravel 5.6...
{{ $foo or 'default' }}

// Laravel 5.7...
{{ $foo ?? 'default' }}

캐시

영향 가능성 : 매우 높음

새로운 data 디렉토리가 storage /framework /cache 에 추가되었습니다. 자신의 어플리케이션에 이 디렉토리를 만들어야합니다 :

mkdir -p storage/framework/cache/data

그런 다음 새로 만든 data 디렉토리에 .gitignore 파일을 추가하십시오.

cp storage/framework/cache/.gitignore storage/framework/cache/data/.gitignore

마지막으로 storage/framework/cache/.gitignore 파일이 다음과 같이 업데이트되었는지 확인하십시오.

*
!data/
!.gitignore

Carbon

영향 가능성 : 매우 낮음

Carbon "macros"는 현재 Laravel의 라이브러리 확장기능 대신 Carbon 라이브러리에 의해 직접 처리됩니다. 우리는 이것이 당신의 코드를 망가뜨릴 것이라고 생각하지는 않습니다. 그러나 이 변경과 관련하여 발생하는 문제가 있다면 알려주십시오.

컬렉션(Collections)

split 메소드

영향 가능성 : 낮음

원래 컬렉션에있는 항목의 총 수가 요청 된 컬렉션 수보다 작은 경우를 제외하고는 split 메소드는 요청 된 수의 "그룹"을 항상 리턴하도록 업데이트되었습니다. 일반적으로 이것은 버그 수정으로 봐야하지만 주의해야 하는 변경사항으로 분류됩니다.

Factory Contract 메소드 사용법

영향 가능성 : 낮음

Illuminate\Contracts\Cookie\Factory 인터페이스의 makeforever 메소드가 변경되었습니다. 이 인터페이스를 구현하는 경우 구현시 이러한 메소드를 업데이트해야합니다.

Database

softDeletesTz 마이그레이션 메소드

영향 가능성 : 낮음

이제 스키마 테이블 빌더의 softDeletesTz 메소드는 기존의 $precision 이 두번째 인자 위치로 옮겨지고 첫 번째 인자로 컬럼의 이름을 입력받습니다 :

/**
 * Add a "deleted at" timestampTz for the table.
 *
 * @param  string  $column
 * @param  int  $precision
 * @return \Illuminate\Support\Fluent
 */
public function softDeletesTz($column = 'deleted_at', $precision = 0)

ConnectionInterface Contract

영향 가능성 : 매우 낮음

Illuminate\Contracts\Database\ConnectionInterface contract의 selectselectOne 메소드가 추가적으로 $useReadPdo 인수를 받을 수 있게 업데이트되었습니다 :

/**
 * Run a select statement and return a single result.
 *
 * @param  string  $query
 * @param  array   $bindings
 * @param  bool  $useReadPdo
 * @return mixed
 */
public function selectOne($query, $bindings = [], $useReadPdo = true);

/**
 * Run a select statement against the database.
 *
 * @param  string  $query
 * @param  array   $bindings
 * @param  bool  $useReadPdo
 * @return array
 */
public function select($query, $bindings = [], $useReadPdo = true);

또한 cursor 메소드가 contract에 추가되었습니다.

/**
 * Run a select statement against the database and returns a generator.
 *
 * @param  string  $query
 * @param  array  $bindings
 * @param  bool  $useReadPdo
 * @return \Generator
 */
public function cursor($query, $bindings = [], $useReadPdo = true);

만약 이 인터페이스를 구현하는 경우 이 메소드를 구현체에 추가해야합니다.

마이그레이션 명령 출력

영향 가능성 : 매우 낮음

코어 마이그레이션 명령이 Migrator 클래스의 출력 인스턴스를 설정하도록 업데이트되었습니다. 마이그레이션 명령을 재정의하거나 확장했다면 $this->migrator->getNotes() 에 대한 참조를 제거하고 대신 $this->migrator->setOutput($this->output) 를 사용해야 합니다.

SQL Server 드라이버 우선 순위

영향 가능성 : 낮음

Laravel 5.7 이전에는 PDO_DBLIB 드라이버가 기본 SQL Server PDO 드라이버로 사용되었습니다. 이 드라이버는 Microsoft에서 더 이상 사용하지 않는 것으로 간주됩니다. Laravel 5.7부터는 PDO_SQLSRV 가 기본 드라이버로 사용됩니다. 또는 PDO_ODBC 드라이버를 사용할 수도 있습니다 :

'sqlsrv' => [
    // ...
    'odbc' => true,
    'odbc_datasource_name' => 'your-odbc-dsn',
],

이 두 드라이버를 모두 사용할 수없을 경우 Laravel은 PDO_DBLIB 드라이버를 사용합니다.

SQLite 외래키

영향 가능성 : 보통

SQLite는 외래키 삭제를 지원하지 않습니다. 이런 이유로 테이블에서 dropForeign 메소드를 사용하면 예외가 발생합니다. 일반적으로 이것은 버그 수정으로 봐야하지만 주의해야 하는 변경사항으로 분류됩니다.

여러 유형의 데이터베이스에서 마이그레이션을 실행하는 경우 마이그레이션에서 DB::getDriverName() 을 사용하여 SQLite에 대해 지원되지 않는 외래키 메소드를 건너 뛰는 것을 고려하십시오.

디버그

덤퍼 클래스

영향 가능성 : 매우 낮음

Illuminate\Support\Debug\DumperIlluminate\Support\Debug\HtmlDumper 클래스는 Symfony의 기본 변수 덤프 Symfony\Component\VarDumper\VarDumperSymfony\Component\VarDumper\Dumper\HtmlDumper 를 사용하기 위해 제거되었습니다.

Eloquent

latest / oldest 메소드

영향 가능성 : 낮음

Eloquent 쿼리 빌더의 latestoldest 메소드는 Eloquent 모델에서 지정할 수있는 사용자 정의 "created at" 타임스탬프 컬럼을 우선시 하도록 업데이트되었습니다. 일반적으로 이것은 버그 수정으로 봐야하지만 주의해야 하는 변경사항으로 분류됩니다.

wasChanged 메소드

영향 가능성 : 매우 낮음

Eloquent 모델은 updated 모델 이벤트가 발생하기 전에 wasChanged 메소드 를 사용할 수 있게 변경되었습니다. 일반적으로 이것은 버그 수정으로 봐야하지만 주의해야 하는 변경사항으로 분류됩니다. 이 변경 사항과 관련하여 문제가 발생하는 경우 알려주십시오.

PostgreSQL의 특수 부동 소수점 값

영향 가능성 : 낮음

PostgreSQL은 부동 소수점 값 Infinity, -InfinityNaN 을 지원합니다. Laravel 5.7 이전에는 컬럼의 Eloquent 캐스팅 타입이 float, double또는 real인 경우 0으로 변환되었습니다.

Laravel 5.7에서 이 값들은 상응하는 PHP 상수 INF, -INF, NAN으로 변환 될 것입니다.

이메일 검증

영향의 가능성 : 선택사항

Laravel의 새로운 이메일 검증 서비스를 사용하기로 결정하였다면 어플리케이션의 추가 스캐폴딩을 추가해야합니다. 먼저 어플리케이션에 VerificationController를 추가하십시오 : App\Http\Controllers\Auth\VerificationController.

또한 App\User 모델을 수정하여 MustVerifyEmail contract를 구현해야합니다 :

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    // ...
}

검증 된 사용자만 지정한 라우트에 접근 할 수 있도록 verified 미들웨어를 사용하려면 app/Http/Kernel.php 파일의 $routeMiddleware 속성을 업데이트하여 새로운 미들웨어를 포함시켜야합니다 :

// Within App\Http\Kernel Class...

protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

또한 인증 뷰의 스텁이 필요합니다. 이 뷰는 resources/views/auth/verify.blade.php 에 위치해야합니다. GitHub에서 이 뷰의 샘플을 얻을 수 있습니다 .

다음으로, 사용자 테이블은 이메일 주소가 검증 된 날짜와 시간을 저장하는 email_verified_at 컬럼을 포함해야합니다.

$table->timestamp('email_verified_at')->nullable();

사용자가 등록 될 때 이메일을 보내려면 App\Providers\EventServiceProvider 클래스에 다음 이벤트 및 리스너를 등록해야합니다 :

use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
];

마지막으로 Auth::routes 메소드를 호출 할 때 메소드에 verify 옵션을 전달해야합니다 :

Auth::routes(['verify' => true]);

파일시스템

Filesystem Contract 메소드

영향 가능성 : 낮음

readStreamwriteStream 메소드는 Illuminate\Contracts\Filesystem\Filesystem contract에 추가되었습니다. 이 인터페이스를 구현하는 경우 이러한 메소드를 구현체에 추가해야합니다.

해싱

Hash::check 메소드

영향 가능성 : 없음

이제 check 메소드는 해시의 알고리즘이 설정된 알고리즘과 일치하는지 체크합니다.

메일

Mailable 동적 변수 캐스팅

영향 가능성 : 낮음

동적으로 mailable 뷰에 전달 된 변수는 자동으로 "camel cased"되어 동적 뷰 변수와 일치하는 동적 mailable 변수의 동작을 제공합니다. 동적인 mailable 변수는 문서화 된 Laravel 기능이 아니므로 어플리케이션에 미치는 영향의 가능성이 낮습니다.

템플릿 테마

영향 가능성 : 보통

Markdown Mailable 템플릿에 사용되는 기본 테마 스타일을 커스터마이징한 경우 다시 커스터마이징하여 만들고 재게시(re-publish)해야합니다. 버튼의 색상 클래스 이름이 'blue', 'green'및 'red'에서 'primary', 'success'및 'error'로 변경되었습니다.

QUEUE_DRIVER 환경 설정 변수

영향 가능성 : 매우 낮음

QUEUE_DRIVER 환경 변수의 이름이 QUEUE_CONNECTION 으로 변경되었습니다. config/queue.php 설정 파일을 Laravel 5.7과 일치하도록 고의적으로 수정하지 않는 한, 업그레이드하고있는 기존 어플리케이션에는 영향을 미치지 않습니다.

(역자주: 이 옵션은 기본적으로 포함된 phpunit.xml과 .env.example에서도 변경되었습니다. 만약 변경된 내역을 일치하게 다 바꾸시고 싶으시다면 이 파일들도 확인해보시기 바랍니다 )

WorkCommand 옵션

영향 가능성 : 매우 낮음

stop-when-empty 옵션이 WorkCommand에 추가되었습니다. 이 커멘드를 확장하는 경우, 클래스의 $signature 프로퍼티에 stop-when-empty를 추가 할 필요가 있습니다.

라우팅

Route::redirect 메소드

영향 가능성 : 높음

Route::redirect 메소드가 이제 302 HTTP 상태 코드 리다이렉션을 리턴합니다. 301 리다이렉트를 허용하기 위해 permanentRedirect 메소드가 추가되었습니다.

// Return a 302 redirect...
Route::redirect('/foo', '/bar');

// Return a 301 redirect...
Route::redirect('/foo', '/bar', 301);

// Return a 301 redirect...
Route::permanentRedirect('/foo', '/bar');

addRoute 메소드

영향 가능성 : 낮음

Illuminate\Routing\Router 클래스의 addRoute 메소드가 protected 에서 public으로 변경되었습니다.

유효성 검사

중첩 된 유효성 검사 데이터

영향 가능성 : 보통

이전 버전의 Laravel에서는 validate 메서드가 중첩 된 유효성 검사 규칙에 대한 올바른 데이터를 반환하지 않았습니다. 이 문제는 Laravel 5.7에서 수정되었습니다 :

$data = Validator::make([
    'person' => [
        'name' => 'Taylor',
        'job' => 'Developer'
    ]
], ['person.name' => 'required'])->validate();

dump($data);

// Prior Behavior...
['person' => ['name' => 'Taylor', 'job' => 'Developer']]

// New Behavior...
['person' => ['name' => 'Taylor']]

Validator Contract

영향 가능성 : 매우 낮음

validate 메소드가 Illuminate\Contracts\Validation\Validator contract에 추가되었습니다. :

/**
 * Run the validator's rules against its data.
 *
 * @return array
 */
public function validate();

만약 이 인터페이스를 구현하는 경우 이 메소드를 구현체에 추가해야합니다.

테스팅

영향 가능성 : 보통

라라벨 5.7은 아티즌 커맨드를 위한 향상된 테스팅 툴을 제공합니다. 기본적으로 아티즌 커맨드의 출력은 mock 처리됩니다. 만약 테스트에서 artisan 메소드를 사용하여 커맨드를 실행 시킬 경우, 테스트 클래스에 Artisan::call 사용하거나 public $mockConsoleOutput = false 를 속성(property)에 정의해야 합니다.

기타

또한 laravel/laravel GitHub repository GitHub 저장소에서 변경사항을 확인하는 것이 좋습니다. 이러한 변경사항이 꼭 필요하지는 않지만, 여러분의 애플리케이션을 이 변경사항들에 맞추어 항상 최신의 상태로 유지하고자 할 수도 있습니다. 변경사항 중 일부는 이 업그레이드 가이드에서 다루지만, 설정 파일이나, 설명의 변경같은 경우 일부는 문서에서 기술하지 않을 수도 있습니다. GitHub 에서 Diff 툴을 사용하여 변경사항을 보다 쉽게 확인하고, 필요한 업데이트를 적용할 수도 있습니다.