laravelシリアル化のためにルートを準備できません…。クロージャを使用


85

Laravel 5.2プロジェクトのキャッシュをクリアすると、次のエラーメッセージが表示されます。

[LogicException]シリアル化のためにルート[パネル]を準備できません。クロージャを使用します。

ルートと関係があると思います

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)); 
}`

In short, from a master view I pass $slug, that is a shortlink to the article, with $slug , which is unique in the database, I identify the record and then I pass it's contents to the detail view.

I didn't have any problem when I wrote the method, infact it worked like a charm, but after I cleaned caches, I get that error and the links in the master view don't show any shortcode.

Where am I doing wrong?


Please edit your question to include the rest of your routes (especially the panel route)
Chris Forrence

回答:


134

I think that it's related with a route

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

associated with a particular method in my controller:

No, thats not it. The error message is coming from the route:cache command, not sure why clearing the cache calls this automatically.

The problem is a route which uses a Closure instead of a controller, which looks something like this:

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

Since Closures can not be serialized, you can not cache your routes when you have routes which use closures.


3
so the command => php artisan route:cache not working on laravel? a bug?
robspin

3
@robspin I don't think it's a bug, since it's explicitly said in Laravel docs laravel.com/docs/5.7/deployment#optimization (check section Optimizing Route Loading)
Anatoliy Arkhipov

4
Since this feature uses PHP serialization, you may only cache the routes for applications that exclusively use controller based routes. PHP is not able to serialize Closures. So not use the php artisan route:cache is the right way! Just use the php artisan cache:clear
robspin

2
so, any solution ?
zukijuki

1
see IBRAHIM EZZAT solution below. Essentially need to replace any closures with controller methods in your route files
Alistair R

52

If none of your routes contain closures, but you are still getting this error, please check

routes/api.php

Laravel has a default auth api route in the above file.

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

which can be commented or replaced with a call to controller method if required.


37

This is definitely a bug.Laravel offers predefined code in routes/api.php

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

which is unabled to be processed by:

php artisan route:cache

This definitely should be fixed by Laravel team.(check the link),

simply if you want to fix it you should replace routes\api.php code with some thing like :

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

and in UserController put this method:

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

2
Seems like a bug indeed. If they make it possible to use closures in routes then they should fix the artisan commands so that they at least don't give any errors.
Arno van Oordt

Here's the relevant PR, which was closed :( github.com/laravel/laravel/pull/4601
William Turrell

7

The Actual solution of this problem is changing first line in web.php

Just replace Welcome route with following route

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

If still getting same error than you probab


6

Check your routes/web.php and routes/api.php

Laravel comes with default route closure in routes/web.php:

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

and routes/api.php

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

if you remove that then try again to clear route cache.


4

the solustion when we use routes like this:

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

laravel call them Closure so you cant optimize routes uses as Closures you must route to controller to use php artisan optimize


2

If someone is still looking for an answer, for me the problem was in routes/web.php file. Example:

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

It is also Route, so yeah...Just remove it if not needed and you are good to go! You should also follow answers provided from above.


1
Hi Aline Matos, no problem. It took me like whole day to figure it out what is wrong...Glad it helped.
DM developing

4
what if it needed?
Aziz

1
@Aziz just move it into a controller
Binar Web

0

check that your web.php file has this extension

use Illuminate\Support\Facades\Route;

my problem gone fixed by this way.

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.