【问题标题】:Laravel route redirect without closure for route cacheLaravel 路由重定向而不关闭路由缓存
【发布时间】:2016-06-07 10:01:01
【问题描述】:

我的routes.php 文件中有此代码用于重定向。虽然问题是每当我运行php artisan route:cache 命令时,它都会给我一个Unable to prepare route [article/{params}] for serialization. Uses Closure. 的错误

我知道这与路由有关,如果它有一个闭包则不允许它被缓存。但是我该如何解决这个重定向?

Route::get('article/{params}', function($params) {
    return Redirect::to($params, 301);
});

【问题讨论】:

  • 我相信你应该能够将你的回报移动到控制器,它会绕过这个问题。
  • 你是在虚拟机内部还是外部运行命令,在虚拟机中试试
  • @simonDavies 我在 vm 之外运行命令。我没有为此使用任何虚拟机。只是在我的本地运行 xampp。
  • 正如@DavidNguyen 所说,使用控制器,因为如果使用我相信的闭包,它目前无法使用路由缓存。

标签: php laravel routes laravel-routing laravel-5.2


【解决方案1】:

由于Laravel 5.5,您可以使用:

Route::redirect('/here', '/there', 301);

查看重定向路由下的documentation

【讨论】:

  • 好多了!
【解决方案2】:

路由缓存不适用于基于闭包的路由。要使用路由缓存,您必须将任何 Closure 路由转换为使用控制器类。

Route::get('article/{params}', 'HelperController@redirect');

在您的控制器中,您可以使用如下所示的重定向功能:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelperController extends Controller
{
  public function redirect($params)
  {
    return Redirect::to($params, 301);
  }
}

【讨论】:

  • 有人可能知道如何执行这种情况,它将参数传递给控制器​​吗? Route::get('articles/{params}', function($params) { return Redirect::to('articles/' . $params . '/edit', 301); }); articles/ 应该是一个可以传递给控制器​​的参数,这样我就可以有一个(1)控制器来重定向。这是因为我有几行只执行相同的功能,并且我不想为每个重定向创建特定的控制器。它必须是一个可以接受参数的动态控制器。
【解决方案3】:

现在缓存路由似乎也适用于闭包。

文档中的警告也从 Laravel 7 中消失了:
https://laravel.com/docs/7.x/controllers#route-caching
到 Laravel 8:
https://laravel.com/docs/8.x/routing#route-caching

也在一个项目中测试过,它没有抱怨。

【讨论】:

    猜你喜欢
    • 2015-11-09
    • 2020-11-08
    • 2016-09-14
    • 2020-03-24
    • 2018-07-07
    • 2017-06-19
    • 2022-01-26
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多