Laravel 统一 API 路由

大家好,我有一个问题想请教一下。
关于API统一路由访问的问题(所有url都指向同一个,根据不同的参数来调用不同的方法)。
前后端分离开发。前端用的是Vue axios发送请求,在钩子函数中将access_token添加到Header中;后端用的Laravel,通过Passport进行用户认证。
前端登录代码如下,使用axios发送请求:

const urlPath = '/serviceAction'
    // 用户登录
    export function loginByUsername(username, password) {
      const params = {
        eventcode: 'login',
        username: username,
        password: password
      }
      return request({
            url: urlPath,
            method: 'post',
            params: params
      })
    }

用户登录后,将获取的token值保存到cookie中。
前端登出代码如下:

export function logout(token) {
          var params = {
            eventcode:'logout',
      }
      return request({
            url: urlPath,// 同上
            method: 'post',
            params: params
      })
}

上两部分代码显示,登录和登出都是post到同一个url,只是根据eventcode进行判断不同。

目前我的Laravel API路由设置和控制器代码如下:

// 路由设置
Route::post('serviceAction', 'API\ServiceActionController@actionDo');

// 控制器ServiceActionController函数actionDo
public function actionDo(Request $request)
{
    $eventCode = $request->input('eventcode');
    if ($eventCode == 'login') {
          return $this->login($request);// login为控制器ServiceActionController的另一个函数
      }
      else if ($eventCode == 'logout') {
          return $this->logout($request);// logout为控制器ServiceActionController的另一个函数
      }
      return 'bad ';
}

能不能login不使用中间件auth:api,而其他所有方法均使用用户认证中间件?

问题描述完毕,先谢谢大家。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

方法1:auth:api里的功能抄出来改到你的控制器做校验
方法2:继承一个新的auth:api,然后增加一部分判断地址,遇到login就跳过
方法3:login路由单独配置
方法4:去看看你用的验证包,有没有路由排除的功能

前三个方法没有场景限制,根据自己的风格决定用哪个

4年前 评论
讨论数量: 3

方法1:auth:api里的功能抄出来改到你的控制器做校验
方法2:继承一个新的auth:api,然后增加一部分判断地址,遇到login就跳过
方法3:login路由单独配置
方法4:去看看你用的验证包,有没有路由排除的功能

前三个方法没有场景限制,根据自己的风格决定用哪个

4年前 评论

可以使用合并请求,就不需要做其他特殊处理了, 跟正常请求一样,不过一般只用于get请求,请的的uri使用参数传过来,例如countries: /api/v1/countries,condition: /api/v1/register/data,在你的控制器中遍历这个数组,可以使用两种方式来分发请求
1,app(\Illuminate\Routing\Router::class)->dispatch($internal_request);
2,app(Illuminate\Foundation\Application::class)->handle($internal_request);
具体的可以去看下这两种方式的代码实现,第2种会比第一种快一些。
合并请求的好处就是,处理多个请求,只要初始化一次框架就好了,请求速度会快一些

4年前 评论

补充,采用最佳答案中的方案2。实现方法为,定义一个中间件,继承自Illuminate\Auth\Middleware\Authenticate,
覆写handle和redirectTo方法,在handle中根据request中的参数进行判断,是否需要验证;在redirectTo中写验证失败收返回401的response.

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!