LogicException : Unable to prepare route [api/user] for serialization. Uses Closure. at /var/www/html/dev_laravel/vendor/laravel/framework/src/Illuminate/Routing/Route.php:917 913| */ 914| public function prepareForSerialization() 915| { 916| if ($this->action['uses'] instanceof Closure) { > 917| throw new LogicException("Unable to prepare route [{$this->uri}] for serialization. Uses Closure."); 918| } 919| 920| $this->compileRoute(); 921| Exception trace: 1 Illuminate\Routing\Route::prepareForSerialization() /var/www/html/dev_laravel/vendor/laravel/framework/src/Illuminate/Foundation/Console/RouteCacheCommand.php:62 2 Illuminate\Foundation\Console\RouteCacheCommand::handle() /var/www/html/dev_laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:32
当我尝试运行laravel命令时
php artisan route:cache
我尝试找出解决方案,但没有找到正确的解决方案。 https://github.com/laravel/framework/issues/22034
这个laravel错误还是还是已修复?
我在web.php文件中有代码
Route::get('/', function () {
return view('welcome');
});
Route::resource('photos', 'PhotoController@index');
我正在使用Laravel 5.8。刚刚安装并迁移了数据库。我是laravel的初学者。
有人可以让我知道正确的解决方法吗?
预先感谢
答案 0 :(得分:1)
这不是错误。如果要缓存路由,则不能使用基于Closure的路由。直接将任何基于Closure的路由定向到Controller方法,您会没事的。 [您在web.php
中有一个,并且错误指出了api.php
中的一个]
您在web.php
中基于闭合的路由可以替换为:
Route::view('/', 'welcome');
这会将其定向到仅处理返回的视图文件的Controller。
api.php
中基于闭包的路由应指向控制器:
Route::middleware('auth:api')->get('user', 'SomeController@user');
将laravel/laravel
项目随附的所有路线都视为正常运行,但出于演示目的而存在。
“不能缓存基于Closure的路由。要使用路由缓存,必须将任何Closure路由转换为控制器类。”
答案 1 :(得分:0)
运行命令php artisan route:cache
Laravel将缓存所有路由并将其存储在指定的缓存驱动程序
中现在出现错误消息:
错误消息清楚地表明
无法缓存关闭路由
甚至Laravel Docs都说Route Caching
默认情况下,Laravel带有四个路由文件
这将有2条基于闭包的路线
解决方案:
LogicException:无法准备路由[api / user]
这意味着
Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});
您的route / api.php中的此代码导致了问题
Route::middleware('auth:api')
->get('/user', 'SomeController@method');
或者如果不使用它,则可以将其删除
答案 2 :(得分:0)
在使用资源进行路由时,您不能使用特定的方法。
您可以使用
Route::resource('photos', 'PhotoController');
或
Route::get('photos', 'PhotoController@index');