laravel 직렬화를 위해… 경로를 준비 할 수 없습니다. 폐쇄 사용


84

Laravel 5.2 프로젝트에서 캐시를 지우면 다음 오류 메시지가 표시됩니다.

[LogicException] 직렬화를 위해 [panel] 경로를 준비 할 수 없습니다. 클로저를 사용합니다.

루트와 관련이 있다고 생각합니다

Route::get('/article/{slug}', 'Front@slug');

내 컨트롤러의 특정 메서드와 관련된 :

public function slug($slug) {
    $article = Article::where('slug',$slug)->first();

    $id = $article ->id_article ;

    if ( ($article=== null) || (is_null($id)) ) return view('errors/Db');

    else return view('detail')->with(array('article'=> $article,  'title'=>'My title - '.$article->title)); 
}`

요컨대, 마스터 뷰에서 기사에 대한 짧은 링크 인 $ slug를 전달하고 데이터베이스에서 고유 한 $ slug를 사용하여 레코드를 식별 한 다음 그 내용을 상세 뷰로 전달합니다.

메서드를 작성할 때 아무런 문제가 없었습니다. 사실 그것은 매력처럼 작동했지만 캐시를 정리 한 후에는 오류가 발생하고 마스터 뷰의 링크에 단축 코드가 표시되지 않습니다.

내가 어디에서 잘못하고 있습니까?


제발 편집 하여 경로의 나머지 부분 (특히 패널 경로)를 포함하는 귀하의 질문에
크리스 Forrence

답변:


133

루트와 관련이 있다고 생각합니다

Route::get('/article/{slug}', 'Front@slug');

내 컨트롤러의 특정 메서드와 관련된 :

아니, 그게 아니야. 오류 메시지는 route:cache명령 에서 발생 하며 캐시를 지우면 자동으로 호출되는 이유가 확실하지 않습니다.

문제는 컨트롤러 대신 Closure를 사용하는 경로입니다. 다음과 같이 보입니다.

//                       Thats the Closure
//                             v 
Route::get('/some/route', function() {
    return 'Hello World';
});

클로저는 직렬화 할 수 없기 때문에 클로저를 사용하는 경로가있을 때 경로를 캐시 할 수 없습니다.


3
그래서 명령 => php artisan route : cache가 laravel에서 작동하지 않습니까? 버그?
robspin

3
@robspin 나는 그것이 Laravel docs laravel.com/docs/5.7/deployment#optimization 에 명시 적으로 언급 되었기 때문에 버그라고 생각하지 않습니다. (라우트 로딩 최적화 섹션 확인)
Anatoliy Arkhipov

4
이 기능은 PHP 직렬화를 사용하므로 컨트롤러 기반 경로를 독점적으로 사용하는 응용 프로그램의 경로 만 캐시 할 수 있습니다. PHP는 클로저를 직렬화 할 수 없습니다. 그러니 php artisan route를 사용하지 마십시오 : cache가 올바른 방법입니다! 명확 : 그냥 PHP 장인 캐시 사용
robspin

2
그래서, 어떤 해결책?
zukijuki 19

1
아래 IBRAHIM EZZAT 솔루션을 참조하십시오. 기본적으로 경로 파일에서 모든 클로저를 컨트롤러 방법으로 대체해야합니다
Alistair R

52

경로에 폐쇄가 포함되어 있지 않지만이 오류가 계속 발생하는 경우 확인하십시오.

route / api.php

Laravel은 위 파일에 기본 인증 API 경로가 있습니다.

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

주석을 달거나 필요한 경우 컨트롤러 메서드에 대한 호출로 바꿀 수 있습니다.


37

이것은 확실히 버그입니다 .Laravel은 routes / api.php에 미리 정의 된 코드를 제공합니다.

Route::middleware('auth:api')->get('/user', function (Request $request) { 
     return $request->user(); 
});

다음에서 처리 할 수 ​​없습니다.

php artisan route:cache

이것은 Laravel 팀에 의해 확실히 수정되어야합니다. ( 링크 확인 ),

간단히 고치고 싶다면 route \ api.php 코드를 다음과 같은 것으로 바꿔야합니다.

Route::middleware('auth:api')->get('/user', 'UserController@AuthRouteAPI');

그리고 UserController에 다음 메소드를 넣으십시오.

 public function AuthRouteAPI(Request $request){
    return $request->user();
 }

2
실제로 버그처럼 보입니다. 경로에서 클로저를 사용할 수있게했다면 적어도 오류가 발생하지 않도록 장인의 명령을 수정해야합니다.
Arno van Oordt

폐쇄 된 관련 PR은 다음과 같습니다. ( github.com/laravel/laravel/pull/4601
William Turrell

7

이 문제의 실제 해결책은 web.php의 첫 번째 줄을 변경하는 것입니다.

환영 경로를 다음 경로로 바꾸십시오.

Route::view('/', 'welcome');

여전히 probab과 같은 오류가 발생하면


6

route / web.phproute / api.php를 확인하십시오.

라 라벨은 route / web.php에 기본 경로 폐쇄를 제공합니다 :

Route::get('/', function () {
    return view('welcome');
});

및 route / api.php

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

그것을 제거한 다음 다시 경로 캐시를 지우십시오.


4

우리가 다음과 같은 경로를 사용할 때의 해결책 :

Route::get('/', function () {
    return view('welcome');
});

laravel은 클로저라고 부르므로 클로저로 라우트 사용을 최적화 할 수 없으므로 사용하려면 컨트롤러로 라우팅해야합니다. php artisan optimize


2

누군가가 여전히 대답을 찾고 있다면, 문제는 route / web.php 파일에있었습니다. 예:

Route::get('/', function () {
    return view('welcome');
});

그것은 또한 경로이므로 예 ... 필요하지 않은 경우 제거하고 갈 수 있습니다! 또한 위에서 제공된 답변을 따라야합니다.


1
안녕하세요 Aline Matos, 문제 없습니다. 무엇이 잘못되었는지 알아내는 데 하루 종일 걸렸습니다.
DM 개발

4
필요하다면?
Aziz

1
@Aziz는 컨트롤러로 이동합니다
Binar Web

0

web.php 파일에이 확장자가 있는지 확인하십시오.

use Illuminate\Support\Facades\Route;

내 문제는 이런 식으로 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.