업데이트가 필요한 문서입니다.

라라벨 5.2가 15년 12월 21일에 발표되었습니다.

5.1을 기준으로 집필중이던 라라벨 도서를 5.2 로 업그레이드 할지 말지 고민하다가 "5.1이 LTS 니까 이걸로 해도 문제 없을거야" 라는 달콤한 속삭임을 뒤로 하고 업그레이드를 결정했습니다.

사실 결정한 이유는 라라벨 5.2 매뉴얼에서  5.1 에서 5.2로 업그레이드가 매우 쉬운 것처럼 써져 있는 이유가 컸습니다.

하지만 매뉴얼대로 업그레이드는 했지만 실제 기존 코드를 자잘하게 수정해야 하는 부분이 꽤 있었습니다.

삽질한 내용을 기록하여 향후 5.1에서 업그레이드할 일이 또 발생할 경우 도움이 되고자 합니다.

artisan make:controller

artisan make:controller 로 생성하는 기본 컨트롤러가 5.1 은 resource 이지만 5.2는 plain 입니다. 만약 리소스 컨트롤러를 만들려면 --resource 옵션을 추가해야 합니다.

php artisan make:controller MyController --resource
CODE

뷰에서 errors 사용

5.1까지는 로그인 실패등 에러가 발생할 경우 뷰에서 다음 코드처럼 $errors 변수를 통해 에러 처리를 할 수 있었지만 5.2에서는 "Undefined variable: $errors"는 에러가 발생할 수 있습니다.

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
CODE

이는 ShareErrorsFromSession 미들웨어가 호출되지 않아서입니다.

5.2에서는 미둘웨어 그룹 기능이 도입되었고 기본 미들웨어 그룹인 'web'에 ShareErrorsFromSession 가 포함되어 있으니 다음과 같이 라우팅 그룹 아래에 에러나는 라우팅을  등록해 주면 됩니다.

Route::group(['middleware' => ['web']], function () {
    // 여기에 라우팅을 추가해 주세요
});
CODE

make:auth 추가

artisan make: 에 auth 가 추가되어서 라우팅, 컨트롤러, 뷰 스캐폴딩을 만들어 줍니다.

$ artisan make:auth
Created View: /home/vagrant/Code/l5.app/resources/views/auth/login.blade.php
Created View: /home/vagrant/Code/l5.app/resources/views/auth/register.blade.php
Created View: /home/vagrant/Code/l5.app/resources/views/auth/passwords/email.blade.php
Created View: /home/vagrant/Code/l5.app/resources/views/auth/passwords/reset.blade.php
Created View: /home/vagrant/Code/l5.app/resources/views/auth/emails/password.blade.php
Created View: /home/vagrant/Code/l5.app/resources/views/layouts/app.blade.php
Created View: /home/vagrant/Code/l5.app/resources/views/home.blade.php
Created View: /home/vagrant/Code/l5.app/resources/views/welcome.blade.php
Installed HomeController.
Updated Routes File.
Authentication scaffolding generated successfully!
CODE

Auth convention 변경

auth 관련 관례가 다음과 같이 변경되었습니다.

  • auth 라우팅 네임이 사라짐. 기존의 auth.login, auth.logout 이 login, logout 으로 변경되었습니다.  artisan route:list 로 확인해 볼 수 있습니다.

    +--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
    
    | Domain | Method   | URI                     | Name | Action                                                          | Middleware |
    
    +--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
    
    |        | GET|HEAD | /                       |      | Closure                                                         |            |
    
    |        | GET|HEAD | home                    |      | App\Http\Controllers\HomeController@index                       | web,auth   |
    
    |        | GET|HEAD | login                   |      | App\Http\Controllers\Auth\AuthController@showLoginForm          | web,guest  |
    
    |        | POST     | login                   |      | App\Http\Controllers\Auth\AuthController@login                  | web,guest  |
    
    |        | GET|HEAD | logout                  |      | App\Http\Controllers\Auth\AuthController@logout                 | web        |
    
    |        | POST     | password/email          |      | App\Http\Controllers\Auth\PasswordController@sendResetLinkEmail | web,guest  |
    
    |        | POST     | password/reset          |      | App\Http\Controllers\Auth\PasswordController@reset              | web,guest  |
    
    |        | GET|HEAD | password/reset/{token?} |      | App\Http\Controllers\Auth\PasswordController@showResetForm      | web,guest  |
    
    |        | GET|HEAD | register                |      | App\Http\Controllers\Auth\AuthController@showRegistrationForm   | web,guest  |
    
    |        | POST     | register                |      | App\Http\Controllers\Auth\AuthController@register               | web,guest  |
    
    +--------+----------+-------------------------+------+-----------------------------------------------------------------+------------+
    CODE

Database: Seeding 클래스에서 Model::guard, reguard() 삭제

공식 매뉴얼(https://laravel.com/docs/5.2/seeding#running-seeders 에는 다음과 같이 database/seeds/DatabaseSeeder.php 에 Model::unguard()와 Model::reguard() 로 시더 클래스를 감싸게 되어 있지만 라라벨을 설치하면 생기는 DatabaseSeeder.ph p에는 삭제되어 있습니다.

DatabaseSeeder .php

public function run()
{
    Model::unguard();

    $this->call(UsersTableSeeder::class);
    $this->call(PostsTableSeeder::class);
    $this->call(CommentsTableSeeder::class);

    Model::reguard();
}
PHP

그래서 db:seed 시 다음 예외가 발생합니다.

[Symfony\Component\Debug\Exception\FatalThrowableError]  Fatal error: Class 'Model' not found

위 문제가 발생하면 DatabaseSeeder 의 상단에 use Illuminate\Database\Eloquent\Model; 를 추가해 주면 됩니다.

참고