【发布时间】:2017-07-22 15:46:05
【问题描述】:
我是 Laravel 的新手,遇到以下问题。
我必须声明一个处理这样的请求的路由:
http://laravel.dev/activate?email=myemail@gmail.com&token=eb0d89ba7a277621d7f1adf4c7803ebc
因此,此 URL 必须采用这种格式(activate 作为资源和 2 个查询参数,格式为 ?email 和 &token。这是不是REST URI。我需要这样使用)。
我需要一个路由和一个控制器方法来处理这种请求。
我知道我可以这样做:
1) 在 routes/web.php 文件中,我声明这样的路由
Route::get('/activate','MyController@myMethod');
2) 进入 MyController 我声明这个方法:
public function myMethod(Request $request) {
if(Input::has('email') && Input::has('token')) {
$email = $request->input('email');
$token= $request->input('token');
// DO SOMETHING USING $email AND $token
}
else {
// SHOW ERROR PAGE
}
}
但只有我觉得这很可怕。我来自 Java,使用 Spring 框架,我可以在 URL 和控制器方法之间的映射中指定一个方法处理对资源的请求,并且必须传递一些要处理的特定查询参数。否则(如果这些参数不存在,则控制器方法不会处理 HTTP GET 请求)。
我知道在 Laravel 中我可以使用我的 URL 的 REST 形式做这样的事情,我认为是这样的:
对于路线映射:
Route::get('/activate/{email}/{token}', [ 'uses' => 'ActivationController@activate', 'as' => 'activate' ]);
然后控制器方法会是这样的:
public function activate($email, $token) {
// $email would be 'myemail@gmail.com'
// $token would be 'eb0d89ba7a277621d7f1adf4c7803ebc'
// do stuff...
}
但在这种情况下我不能使用这种 URI(如指定的 URL 模式必须采用以下格式:
http://laravel.dev/activate?email=myemail@gmail.com&token=eb0d89ba7a277621d7f1adf4c7803ebc
所以我希望用这种 URI 做这样的事情。我不会将 Request $request 对象传递给我的控制器方法,然后从中提取参数,但我希望有一个这样的控制器方法签名:
public function activate($email, $token) {
如果没有传递所有预期的参数,则此控制器不会处理请求。
我更喜欢这样做,因为对我来说是一种更简洁的方法(读取控制器签名,其他开发人员立即知道该方法是预期的)。
而且还因为我希望方法不处理格式错误的参数(因此我可以避免处理错误情况,例如:用户未传递 2 个参数)。
我怎样才能在 Laravel 中做这样的事情? (如果可能的话……)
【问题讨论】:
-
您可以创建进行检查(过度杀伤)的中间件,也可以创建进行验证的自定义 form request,这样如果没有有效参数,您的控制器方法就不会被命中。
标签: php laravel laravel-5 laravel-5.3 laravel-routing