如何在 Laravel 中声明采用这两个参数的路由?

Posted

技术标签:

【中文标题】如何在 Laravel 中声明采用这两个参数的路由?【英文标题】:How can I declare a route taking these two parameters in Laravel? 【发布时间】:2017-07-21 04:49:18 【问题描述】:

我是 Laravel 的新手,遇到以下问题。

我必须声明一个处理这样的请求的路由:

http://laravel.dev/activate?email=myemail@gmail.com&token=eb0d89ba7a277621d7f1adf4c7803ebc

所以基本上它必须使用两个获取参数emailtoken 处理对/activate 资源的GET 请求。

如何正确声明这条路线?那么我只需要创建带有这两个参数的相关控制器方法吗?

【问题讨论】:

Route::get("/activate/parameter1/parameter2", "Controller@getMethod");,然后是 public function getMethod($parameter1, $parameter2) ... ; laravel.com/docs/5.4/routing#route-parameters 了解更多信息。请记住,Route 参数GET 参数(即查询字符串中的参数)相同 【参考方案1】:

routes.php(Laravel web.php(Laravel 5.4+)中:

Route::get('/activate', [ 'as' => 'activate', function()

    return app()->make(App\Http\Controllers\ActivateController::class)->callAction('activate', $parameters = [ 'email' => request()->email, 'token' => request()->token ]);
]);

所以我们正在实例化 ActivateController 类并调用方法“activate”,它是第一个参数,然后以数组的形式提供该方法接收的参数列表。

public function activate($email, $token)

    echo "Email: $email"; // myemail@gmail.com
    echo "Token: $token"; // eb0d89ba7a277621d7f1adf4c7803ebc
    // do stuff

【讨论】:

这是非常糟糕的做法,因为它无法缓存路由。此外,参数的注入似乎是大量的代码复制,我认为这个答案误导了 OP 执行不良做法。请只使用 Route::get('/activate', ['as' => 'activate', 'uses' => '\App\Http\Controllers\ActivateController@activate']); 然后在您的控制器中使用 $email = request()->input('email');$token = request()->input('token'); ,只需按照 laravel.com/docs 所说的操作,您的生活就会变得更轻松......而且您在同一个问题上有两个答案【参考方案2】:

路线是这样的:

Route::get('account/email/validate', 'AccountsController@validateEmail')->name('account.validate.email');

控制器方法如下:

public function validateEmail()

    // request()->email
    // request()->token

要使用查询字符串生成 URL,您必须执行以下操作:

<a href="<?= route('account.validate.email', ['email' => $email, 'token' => $token]) ?>">

或者你也可以硬编码。

【讨论】:

不,我不能使用像“/activate/email/token”这样的URI。我需要使用我的帖子中指定的 ?param=value 来使用带有 GET 参数的 URL【参考方案3】:

路线:

Route::get('/activate/email/token', [ 'uses' => 'ActivationController@activate', 'as' => 'activate' ]);

控制器:

ActivationController.php

public function activate($email, $token)

    // $email would be 'myemail@gmail.com'
    // $token would be 'eb0d89ba7a277621d7f1adf4c7803ebc'
    // do stuff...

或者如果你必须使用查询参数:

路线:

Route::get('/activate', [ 'uses' => 'ActivationController@activate', 'as' => 'activate' ]);

控制器:

public function activate(Request $request)

    if ( $request->has('email') && $request->has('token') )
    
        $email = $request->email;
        $token = $request->token;
    

【讨论】:

不,我不能使用像“/activate/email/token”这样的URI。我需要使用我的帖子中指定的 ?param=value 来使用带有 GET 参数的 URL【参考方案4】:

您将实际使用这两个功能之一。您不必同时使用这两个功能。 我的建议是只使用路线。 示例:

<?php Router::connect(
'/activate/:email/:token',
['controller' => 'Accounts', 'action' => 'activate'],
['email' => '.*', 'token' => '.*']); ?>

然后您将使用以下网址:your-site.com/accounts/activate/your-email@email.com/your-token

路由代码必须放在/config/routes.php中

更多详情请见:https://book.cakephp.org/3.0/en/development/routing.html

【讨论】:

我需要使用 ?paramName=value 声明的 GET 参数 也一样。并且仍然具有使用友好 url 的优势... 您可以将此想法扩展为:/controler/whatever/you/want 这样系统已经为您提供了控制器中的数据以供使用。例子:Router::connect('/activate/:p1/:p2/:p3/:p4'...) 极限是你的想象,代码优化无敌。【参考方案5】:

要将参数作为查询参数传递,您可以在可以注入控制器方法的请求对象中获取它们:

路线

Route::get('/activate', 'YourController@controllerMethod');

控制器

public function controllerMethod(Request $request)

    $email = $request->input('email');
    $code = $request->input('code');

此外,您还可以将第二个参数传递给input,以在其中任何一个不存在时用作默认值。

【讨论】:

我可以在路由中指定参数而不是从请求对象中检索这些参数吗= 你不能在路由定义中指定它们而不将它们注入控制器。您可以通过$request-&gt;only('email', 'code'); 在请求对象中访问它们,如果emailcode 不在请求中,则为您提供一个2 项数组['email' =&gt; 'youremail@mail.com', 'code' =&gt; 'somecode'],它只会将其排除在数组之外,或者如果不存在您'将得到一个空数组。【参考方案6】:

如果您不想使用 URL 重写(Pretty URL),只需将路由声明为:

Route::get('/activate','YourController@yourFunction');

并在控制器中检查令牌和电子邮件:

if(Input::has('email') && Input::has('token))

  //YOUR CODE

【讨论】:

URL 重写是什么意思?我将参数指定到路由中,然后将其传递给控制器​​方法? 当我说 URL 重写时,我的意思是你的 url 看起来像:laravel.dev/activate/myemail@gmail.com/… 如果你想使用这种方法:***.com/a/42539104/2952213 这就是你的答案。 像什么?您的消息似乎不完整

以上是关于如何在 Laravel 中声明采用这两个参数的路由?的主要内容,如果未能解决你的问题,请参考以下文章

如何在laravel路由中定义两个参数

laravel 包中路由声明的顺序

laravel 5.2 如何在刀片中获取路由参数?

如何在 laravel 的 javascript 代码中设置路由名称

如何在 Laravel 5.2 中使用资源声明路由

如何在Laravel 5.2中将表单数据作为路由参数传递