【问题标题】:Laravel access route parameter in route web.php fileLaravel 访问路由 web.php 文件中的路由参数
【发布时间】:2018-12-22 03:08:01
【问题描述】:

参数发布到some_name,如下所示: {{ route('some_name', $id = '1'}} if 条件下如何访问?

Route::group(['prefix' => '/'], function()
{
    if ( condition )
    {
        Route::get('/route/{id}', 'ControllerA@methodA')->name('some_name');
    } else{
        Route::get('/route{id}', 'ControllerB@methodB')->name('some_name');;
    }
});

如何在if (condition) 中使用{id} 参数? 我试过了

Route::group(['prefix' => '/'], function($id)
    {
        if ( $id == 1)

而且它不起作用。

【问题讨论】:

  • 您必须使用"prefix" => "{id} 才能在function($id) 中使用$id。老实说,不确定您要在这里处理什么。您可以使用{id?} 作为可选参数,使用function($id = null),然后在$id 是否为null 时处理大小写,所以也许可以试试?

标签: php laravel laravel-5 laravel-routing laravel-5.6


【解决方案1】:

我认为你能做的最好的事情是中间件,例如:

public function handle($request, Closure $next)
{
    if ($request->id == 'some_value') {
        redirect action('ControllerA@methodA');
    }
    else {
      redirect action('ControllerB@methodB');
    }

    return $next($request);
}

【讨论】:

  • 您认为哪个更好:您的解决方案还是只做一条路线并检查控制器中的条件并返回适当的视图?两者都对我有用,我想知道哪个更好。
  • 我认为这取决于逻辑的不同程度,如果您正在执行 A/B 测试,我认为您的解决方案会更好。所以如果新建控制器的逻辑没有大的变化,只要根据条件显示对应的视图即可@Victordb
【解决方案2】:

检查文档,我个人从来没有在我的路由文件夹中做过if,除此之外,练习这样的东西真的很危险,让一切都发生在视图中,如果你搞砸了用户登录与否,请执行auth::check() 或类似的操作,但永远不要使用路由web.php 以确保您的应用程序的安全性,其他一切都在控制器和视图上完成。

【讨论】:

  • 我最终只做了一个路由,检查控制器内部的条件并返回适当的视图。谢谢。
【解决方案3】:

我认为验证路由文件中的 id 以重定向到不同的控制器不是一个好习惯,原因如下:

您将向该端点发送一个请求并发送一个 ID。

  1. 该 ID 有效吗?你怎么知道?
  2. ID 是整数还是字符串?
  3. 请求中是否存在 ID?

通过这 3 个问题,您最终将获得验证 + 重定向到不同的方法,如果它是数据库查询感兴趣的 ID,那么您也将在其中获得数据库代码。

我喜欢认为的正常过程是当它到达路由时,它应该到达授权和身份验证(如 Bak87 所说的中间件)。在那里,您可以验证他是否已通过身份验证,他是否是某个用户,无论您想要什么。

在此初始验证之后,您可以根据需要将其重定向到某个控制器中的某个方法,但是,我不建议根据某些标准,一个类应该有一个单一的目的(但最后,您可以按照自己的意愿构建应用程序)。

我相信一个路由或一组路由应该有一个中间件(对于您需要对发出请求的人进行的任何主要验证),并且每个路由应该指向控制器中的单个方法。一旦它到达控制器,您可以拥有自己的自定义 FormRequest,而不是将 (Request $request) 作为方法的参数,如果您愿意,您可以在其中验证 ID。

如果对 FormRequest 不感兴趣,您可以使用 Eloquent(如果您要查找的 ID 与之相关)FindOrFail 来验证它是否存在(如果不存在,则返回 404 错误未找到,如果您有 404.blade.php 文件)。这样,当它到达控制器的方法时,它已经被部分验证,然后路由受到主要授权和身份验证的保护,FormRequest 进行输入验证,您可以专门从控制器返回您想要的任何内容方法。

显然我们不知道您返回的视图是什么,但如果彼此略有不同,请考虑重构它以便仅返回 1 个视图,由其他刀片组成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多