GVKun编程网logo

laravel接口公共参数校验-路由中间件使用(laravel 接口)

22

关于laravel接口公共参数校验-路由中间件使用和laravel接口的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Laravel5.1.4+Bootstrap3.3.5笔记三:Lara

关于laravel接口公共参数校验-路由中间件使用laravel 接口的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Laravel 5.1.4 + Bootstrap 3.3.5 笔记三:Laravel 中间件、laravel jetstream请求api路由中间件受保护的api:sanctum返回未经身份验证的响应、laravel 中间件、laravel 中间件及路由分离等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

laravel接口公共参数校验-路由中间件使用(laravel 接口)

laravel接口公共参数校验-路由中间件使用(laravel 接口)

假设我们使用laravel(v8.59.0)框架做的接口有公共参数校验需要校验请求参数time和sign

首页需要创建一个中间价,在laravel框架内使用如下命令创建名为 Utilverify 的中间件

PHP artisan make:middleware Utilverify

 

 命令执行后,如果创建成功,如下返回

 

 

 会自动生成中间件文件 app\Http\Middleware\Utilverify.PHP,其内容如下

<?PHP

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class Utilverify
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        return $next($request);
    }
}

 可以在return $next($request);之前做参数校验,具体逻辑需要根据业务定义,如下

    public function handle(Request $request, Closure $next)
    {
        $time = $request->input('time');
        $sign = $request->input('sign');
        if(!isset($time)||!isset($sign)){
           // 校验失败返回
        }else{
           // 校验成功返回
        }
        return $next($request);
    }

 

中间件分配给特定的路由,首先在 app/Http/Kernel.PHP 文件中为中间件分配一个键。该类的 $routeMiddleware 属性包含 Laravel 中包含的中间件的条目

 

 

 

在路由文件中routes\api.PHP 使用 middleware()方法将中间件分配给路由。

 

 

 

最后,发送一个请求测试下中间件是否生效。

 

Laravel 5.1.4 + Bootstrap 3.3.5 笔记三:Laravel 中间件

Laravel 5.1.4 + Bootstrap 3.3.5 笔记三:Laravel 中间件

总结

以上是小编为你收集整理的Laravel 5.1.4 + Bootstrap 3.3.5 笔记三:Laravel 中间件全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

laravel jetstream请求api路由中间件受保护的api:sanctum返回未经身份验证的响应

laravel jetstream请求api路由中间件受保护的api:sanctum返回未经身份验证的响应

我遇到了类似的问题,我无法验证前端的任何API请求。事实证明,生成的Kernel.php默认不包含用于会话cookie的Sanctum中间件-app/Http/Kernel.php中的you have to add it manually:

 'api' => [
        EnsureFrontendRequestsAreStateful::class,// <- Add and import this middleware
        'throttle:api',\Illuminate\Routing\Middleware\SubstituteBindings::class,],

执行完此API后,来自前端的请求将再次起作用。也许这也可以解决您的问题。

laravel 中间件

laravel 中间件

Laravel 中间件提供了一种方便的机制来过滤进入应用的 HTTP 请求。例如,Laravel 内置了一个中间件来验证用户的身份认证。如果用户没有通过身份认证,中间件会将用户重定向到登录界面。但是,如果用户被认证,中间件将允许该请求进一步进入该应用,所有中间件都位于 app/Http/Middleware 目录下

一:创建中间件

使用 make:middleware 命令来创建新的中间件

php artisan make:middleware CheckAge  #CheckAge表示的是中间件文件名称

该命令将会在 app/Http/Middleware 目录内新建一个 CheckAge 类

在这个中间件里,我们仅允许提供的参数 id 大于 200 的请求访问该路由。否则,我们会将用户重定向到 home

<?php
namespace App\Http\Middleware;
use Closure;
class CheckAge
{
    /**
     * 处理传入的请求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->id<= 200) {
            return redirect(''home'');
        }
        return $next($request);
    }
}

二:前置和后置中间件

中间件是在请求之前或之后运行取决于中间件本身

1:前置中间件

<?php
namespace App\Http\Middleware;
use Closure;
class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // 执行动作
        return $next($request);
    }
}

2:后置中间件

<?php
namespace App\Http\Middleware;
use Closure;
class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        // 执行动作
        return $response;
    }
}

三:注册中间件

1:注册全局中间件

如果你想让中间件在你应用的每个 HTTP 请求期间运行,只需在 app/Http/Kernel.php 类中的 $middleware 属性里列出这个中间件类

protected $middleware = [
    \App\Http\Middleware\TrustProxies::class,
    \App\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

2:为路由分配中间件

如果想为指定的路由配置中间件,首先应该在 app/Http/Kernel.php 文件内为该中间件指定一个键。默认情况下,Kernel 类的 $routeMiddleware 属性包含 Laravel 内置的中间件条目。要加入自定义的,只需把它附加到列表后并为其分配一个自定义键即可

protected $routeMiddleware = [
    ''auth'' => \App\Http\Middleware\Authenticate::class,
    ''auth.basic'' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    ''bindings'' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ''cache.headers'' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    ''can'' => \Illuminate\Auth\Middleware\Authorize::class,
    ''guest'' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    ''signed'' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    ''throttle'' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ''verified'' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];

一旦在 Kernel 中定义了中间件,就可使用 middleware 方法将中间件分配给路由

Route::get(''admin/profile'', function () {
    //
})->middleware(''auth'');你还可以为路由分配多个中间件
Route::get(''/'', function () {
    //
})->middleware(''first'', ''second'');

分配中间件时,你还可以传递完整的类名

use App\Http\Middleware\CheckAge;

Route::get(''admin/profile'', function () {
    //
})->middleware(CheckAge::class);

3:中间件组

有时你可能想用单一的键为几个中间件分组,使其更容易分配到路由。可以使用 Kernel 类的 $middlewareGroups 属性来实现

protected $middlewareGroups = [
    ''web'' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    ''api'' => [
        ''throttle:60,1'',
        ''bindings'',
    ],
];

可以使用与单个中间件相同的语法将中间件组分配给路由和控制器操作

Route::get(''/'', function () {
    //
})->middleware(''web'');
Route::group([''middleware'' => [''web'']], function () {
    //
});

4:排序中间件

很少情况下,你可能需要中间件以特定的顺序执行,但是当它们被分配到路由时,你无法控制它们的顺序。在这种情况下,可以使用 app/Http/Kernel.php 文件的 $middlewarePriority 属性指定中间件优先级

protected $middlewarePriority = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\Authenticate::class,
    \Illuminate\Routing\Middleware\ThrottleRequests::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
];

5:中间件参数

中间件也可以接受额外的参数。例如,如果应用需要在运行特定操作前验证经过身份认证的用户是否具备给定的「角色」,你可以新建一个 CheckRole 中间件,由它来接收「角色」名称作为附加参数。

附加的中间件参数应该在 $next 参数之后被传递:

<?php
namespace App\Http\Middleware;
use Closure;
class CheckRole
{
    /**
     * 处理传入的请求
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
            // 重定向...
        }
        return $next($request);
    }
}

定义路由时通过一个 : 来隔开中间件名称和参数来指定中间件参数。多个参数就使用逗号分隔

Route::put(''post/{id}'', function ($id) {
    //
})->middleware(''role:editor'');

6:Terminable 中间件

laravel 内置的「session」中间件会在响应发送到浏览器之后将会话数据写入存储器中。如果你在中间件中定义一个 terminate 方法,则会在响应发送到浏览器后自动调用

<?php
namespace Illuminate\Session\Middleware;
use Closure;
class StartSession
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
    public function terminate($request, $response)
    {
        // Store the session data...
    }
}

terminate 方法应该同时接收和响应。一旦定义了这个中间件,你应该将它添加到路由列表或 app/Http/Kernel.php 文件的全局中间件中

在你的中间件上调用 terminate 调用时,Laravel 会从 服务容器 中解析出一个新的中间件实例。如果要在调用 handle 和 terminate 方法时使用同一个中间件实例,就使用容器的 singleton 方法向容器注册中间件

laravel 中间件及路由分离

laravel 中间件及路由分离

$middleware 属性:

这个属性称为全局中间件,为什么说是全局中间件呢?因为你的每一次请求,这里面的每个中间件都会执行。

$routeMiddleware 属性:

这个属性称为路由中间件,为什么说是路由中间件呢?因为定义在该属性内的中间件,只能在定义路由时候引用

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

如果我们要使用 \Illuminate\Auth\Middleware\Authenticate::class 这个中间件该怎么做呢?

Route::get(''hello/laravel-china'',''XXController@index'')->middleware(''auth'');

我们定义路由时候调用了 middleware 方法,参数值是 auth, 这样访问这个路由的时候,就会执行该中间件。明白了吧!很简单的。

$middlewareGroups 属性:

这个属性称为中间件组,为什么说是中间件组呢?我们之前说了路由中间件,是不是感觉这样添加路由中间件很麻烦,比如我们执行 10 个中间件,是不是就要在定义路由时候添加 10 个呢?有了中间件组就不用这么麻烦了。我们来看下中间件组是怎么定义的。

protected $middlewareGroups = [
    ''web'' => [
        \App\Http\Middleware\EncryptCookies::class,
        ...
    ],
    ''api'' => [
        ...
    ],
];

  好了,上面的例子就是定义中间件组的格式,比如我们看 web 这个键值,它对应为一个数组,该数组有多个中间件组成。当我们定义好后,该怎么使用呢?
我们在声明路由的时候,这样调用就可以了。

Route::group([''middleware'' => ''web''],function($route){
    $route->get(''hello/world'',function(){});
    $route->get(''hello/php'',function(){});
    // 这样在访问这个这些路由的时候,就会执行中间件组 web 所对应的中间件,方便多了,批量式的。
});

$middleware:全局中间件,要对所有的请求要做一些处理的时候,就适合定义在该属性内。(比如统计请求次数这些)
$middlewareGroups:中间件组,比如我们项目有 api 请求和 web 的请求的时候,就要把两种类型的请求中间件分离开来,这时候就需要我们中间件组啦。
$routeMiddleware:路由中间件,有些个别的请求,我们需要执行特别的中间件时,就适合定义在这属性里面。

 

Laravel的路由功能很强大,默认都是定义在 routes.php 文件中,随着项目越来越大,我们需要的定义的路由越来越多,想象一下,如果几百上千个路由都定义在一个文件中,如何去维护?也许还有不同的人都在同一个文件定义路由,这就造成了冲突,因此我们需要分割 routes.php 文件

在 app/Providers/RouteServiceProvider.php 的 map 方法中可以如下定义:

public function map(Router $router)
{
    $router->group([''namespace'' => $this->namespace], function ($router) {
        foreach (glob(app_path(''Http//Routes'') . ''/*.php'') as $file) {
            $this->app->make(''App\\Http\\Routes\\'' . basename($file, ''.php''))->map($router);
        }
    });
}

这样它会遍历 app/Http/Routes/ 文件夹下的文件,遍历每个文件路由类的 map 方法,每个文件的结构都类似,举个例子:

<?php

namespace App\Http\Routes;

use Illuminate\Contracts\Routing\Registrar;

class HomeRoutes
{
    public function map(Registrar $router)
    {
        $router->group([''domain'' => ''www.xxx.me'', ''middleware'' => ''web''], function ($router) {
            $router->auth();
            $router->get(''/'', [''as'' => ''home'', ''uses'' => ''IndexController@index'']);
            $router->get(''/blog'', [''as'' => ''index.blog'', ''uses'' => ''BlogController@index'']);
        });
    }
}

那么这样路由分开多个文件后岂不是增加调用次数,会不会影响性能?答案是不必担心。通过 Laravel 的命令:

php artisan route:cache

生成路由缓存文件后,路由只会读取缓存文件的路由规则,因此不会影响性能,这样做让开发更高效和规范。

 

第二种方法

项目\app\Providers\RouteServiceProvider.php

在下方添加自己想要的

public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    //这里随意添加自己想要的 如后台 也可以改动他原来的代码

     $this->mapAdminRoutes();
    
}

新增你添加的方法

protected function mapWebRoutes()
{
    Route::middleware(''web'')
         ->namespace($this->namespace)
         ->group(base_path(''routes/web.php''));
}

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

        foreach (glob(base_path(''routes/Api'') . ''/*.php'') as $file) {
            Route::middleware(''api'')
                ->namespace($this->namespace)
                ->group($file);
        }

        /*        Route::prefix(''api'')
                     ->middleware(''api'')
                     ->namespace($this->namespace)
                     ->group(base_path(''routes/api.php''));*/
    }

//这是新增的
protected function mapAdminRoutes()
    {
//        Route::prefix(''api'')
//            ->middleware(''api'')
//            ->namespace($this->namespace)
//            ->group(base_path(''routes/api.php''));

        foreach (glob(base_path(''routes/Admin'') . ''/*.php'') as $file) {
            Route::middleware(''admin'')
                ->namespace($this->namespace)
                ->group($file);
        }

        /*Route::middleware(''web'')
             ->namespace($this->namespace)
             ->group(base_path(''routes/web.php''));*/
    }

  在routes文件夹下,你就可以随意定义自己的路由了

 

关于laravel接口公共参数校验-路由中间件使用laravel 接口的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Laravel 5.1.4 + Bootstrap 3.3.5 笔记三:Laravel 中间件、laravel jetstream请求api路由中间件受保护的api:sanctum返回未经身份验证的响应、laravel 中间件、laravel 中间件及路由分离的相关知识,请在本站寻找。

本文标签: