新下载的laravel作为api服务的准备工作

本文详细介绍Laravel作为API后端框架的初始化步骤,包括时区、语言环境配置,路由正则验证,中间件自定义及JWT认证设置,帮助开发者快速搭建稳定、高效的API服务。

若laravel作为后端api接口框架,新下载的laravel需要哪些初始化操作呢?

设置时区和语言

config/app.php >

'timezone' => 'PRC', //时区

'locale' => 'zh-CN', //应用程序语言环境配置

// 其他app.php中没有的配置,可自行添加
'log_max_files' => 30, //日志保存天数

路由服务提供者

App\Providers\RouteServiceProvider.php >
	public function boot()
  	{
        Route::pattern('id', '[0-9]+'); //添加参数正则验证

        parent::boot();
    }

    protected function mapApiRoutes()
    {
        Route::prefix('api') //前缀 domain/api/user/login
             ->middleware('api') //中间件
             ->namespace($this->namespace . '\Api\\') //控制器所在目录
             ->group(base_path('routes/api.php'));//路由文件
    }

下面分析下->middleware('api'),api路由默认的中间件api是什么?

App\Http\Kernel.php >
protected $middlewareGroups = [
        'web' => [
        	...
        ],

        'api' => [
            'throttle:60,1', 
            'bindings',
        ],
    ];
protected $routeMiddleware = [
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        ...
    ];

throttle
throttle:节流阀。throttle:60,1 :一分钟访问60次,throttle为中间件名称,后为参数。对应类文件名ThrottleRequests。但这里选择注释的原因:1,控制接口访问频率的,这个很有用。然而它响应内容是一个HTML页面,我们希望得到一个json响应。2,不同接口有不同的限制频率,而不是所有接口频率限制一样。本人认为正确的做法是,自定义该中间件返回Json响应,并在路由文件中为每个接口设置中间件。

bindings
bindings:绑定。对应类文件名SubstituteBindings。将路由参数转化为特定对象的组件。

路由 >
Route::get('user/{userid}', 'UserController@info');

UserController >
public function info(UserModel $userid){..}

它将user/参数对应为UserModel,userid为主键,这样根据userid参数自动实例化为数据库模型对象$userid

回过头来看路由服务配置,就知道该如何配置了。如果两者都不使用可注释->middleware('api')

protected function mapApiRoutes()
    {
        Route::prefix('api') 
             //->middleware('api') //中间件
             ->namespace($this->namespace . '\Api\\')
             ->group(base_path('routes/api.php'));
    }

auth中间件
检查是否登陆。打开默认的api路由文件

routes\api.php >

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

auth:apiauth是中间件名称,是参数。

App\Http\Kernel.php >
protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        ...
    ];

auth中间件的类文件为Authenticate.php,那查看源码可知,如果验证未通过,抛出Exception,也不是我们希望的Json数据。所以通常要自定义(上面已提到ThrottleRequests中间件同样的问题)。

auth驱动
紧接着上部分,看看auth认证是如何检查是否登陆的。上面已提到auth中间件的源类文件是Authenticate.php,那么看下源码(一般编辑器都能直接跟踪源代码,如果不能,试试ctrl+p快捷键,输入文件名):

\Illuminate\Auth\Middleware\Authenticate.php >
//核心代码
protected function authenticate(array $guards)
    {
    	//guards卫兵
    	//就是Route::middleware('auth:api')的api参数
        if (empty($guards)) {
            return $this->auth->authenticate();
        }

        foreach ($guards as $guard) {
            if ($this->auth->guard($guard)->check()) {
                return $this->auth->shouldUse($guard);
            }
        }

        throw new AuthenticationException('Unauthenticated.', $guards);
    }

那么主要的验证代码是check()函数,如果说web验证是否登陆是根据session,那么接口并没有session。这些配置在配置文件config/auth.php中:

'defaults' => [
        'guard'     => 'api',
        'passwords' => 'users',
    ],
'guards' => [
        'web'   => [
            'driver'   => 'session',
            'provider' => 'users',
        ],
        'admin' => [
            'driver'   => 'session',
            'provider' => 'admins',
        ],
        'api'   => [
            'driver'   => 'jwt',
            'provider' => 'users',
        ],
    ],

$this->auth->guard($guard)方法时会读取这个文件,如果使用的Route::middleware('auth:api'),那么则是$this->auth->guard('api'),读取到guards数组下的api数组。

'api'   => [
            'driver'   => 'jwt',
            'provider' => 'users',
        ],

api接口,一般选择jwt。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值