甚至可以在一条路线中拥有多个中间件。现在我有我的网络应用程序使用auth的中间件发出ajax请求,这是在auth:web
的默认值Route::post('/user/postAuthUserInfoAjax', [
'uses' => 'UserController@postAuthUserInfoAjax',
'middleware' => ['auth'],
]);
我还想要我的移动应用程序,它具有API访问令牌(使用laravel passport)来验证用户是否能够访问这些相同的路由。为了做到这一点,我只需指定' auth:api'在我的中间件中。
Route::post('/user/postAuthUserInfoAjax', [
'uses' => 'UserController@postAuthUserInfoAjax',
'middleware' => ['auth:api'],
]);
唯一的问题是我无法指定多个中间件。我可以使用' auth:api'或者' auth:web'但不是两个。我想我可以为每个ajax请求设置两个路由,一个用于web应用,另一个用于api请求,但如果我只能使用一个路由,那将会好得多。
我试过了,但它不起作用。有谁知道如何做到这一点?它是否可能
Route::post('/user/postAuthUserInfoAjax', [
'uses' => 'UserController@postAuthUserInfoAjax',
'middleware' => ['auth:web','auth:api'],
]);
答案 0 :(得分:0)
这不起作用,因为您说的如下:
在处理此请求之前,请验证用户是否通过Web提供程序进行了身份验证,但是,它们也必须通过我的api提供程序进行身份验证。
您可以采用的一种方法是只使用两个控制器,但扩展一个基本控制器,其功能已经被烘焙:
App
|
---- Http
|
---- Controllers
|
---- UserController (this will be our base)
---- API
|
---- UserController (will extend the base)
---- Web
|
---- UserController (will extend the base)
然后你应该相应地设置路线组:
//Your "web provider" authenticated routes
Route::group(['middleware' => ['auth:web'] 'namespace' => 'Web', function(){
});
然后是您的API请求:
//your "api provider" authenticated routes
Route::group(['middleware' => ['auth:api'], 'namespace' => 'API', function(){
});
这是我们将两个组合在一起的路线:
Route::post('user/info', 'UserController@info');
然后基本控制器看起来像这样:
class UserController extends App\Http\Controller {
/**
* Update the specified User Resource
*
* @param Illuminate\Http\Request $request
* @param App\User $user
*
* @returns mixed
*/
public function update(Illuminate\Http\Request $request, App\User $user)
{
if ($request->ajax()) {
try {
DB::transaction(function() use ($request, $user) {
$user->update($request->only($user->getFillable()));
});
DB::commit();
} catch (\Exception $e){
DB::rollback();
return response()->json($e->getMessage(), 422);
}
}
}
}
注意我输入的内容无法访问实际代码,因此$user->getFillable()
可能会返回一个集合,要求您将其转换为数组。如果是这种情况,只需将$user->getFillable()->toArray()
链接到最后。
这样做的神奇之处在于,如果进程成功请求,您可以使用promise对象上的.done()
捕获该进程。如果失败,那么您将收到422 Unprocessable Entity in Request
消息,这将在promise对象上触发.fail()
。
现在,只需从UserController
UserControllers中扩展此基础API/Web
:
<?php
namespace App\Http\Controllers\Api;
class UserController extends App\Http\Controllers\UserController {
}
虽然您必须进行一些逻辑重复,但为了清晰起见,在整个应用程序堆栈中保持这种分离级别非常重要。如果您仍需要更改任一路线的内容,此方法仍然允许您进行一定程度的精细控制,但为您提供了工作基础。
希望这有帮助。