在laravel中设置默认中间件

时间:2018-02-08 11:55:24

标签: laravel laravel-5.5

我是Laravel Framework的新手。我想设置一个将在所有HTTP请求中调用的中间件。我如何设置该中间件?

2 个答案:

答案 0 :(得分:2)

使用全球中间件。来自the docs

  

如果您希望在对应用程序的每个HTTP请求期间运行中间件,请在$middleware类的app/Http/Kernel.php属性中列出中间件类。

答案 1 :(得分:1)

如果您希望在对应用程序的每个HTTP请求期间运行中间件,请在app / Http / Kernel.php类的$ middleware属性中列出中间件类,它称为全局中间件。

我们举个例子

创建中间件

我们可以使用工匠轻松创建新的中间件。

php artisan make:middleware AdMiddleware

在我们创建了一个新的中间件组件之后,我们需要考虑修改代码以满足我们的需求。

更新我们的中间件文件:

运行make:middleware命令后,您应该在app / http / middleware中看到新的中间件文件。打开它,我们将创建一个中间件来获取请求的IP地址,然后确定该请求来自哪个国家。

    <?php

namespace App\Http\Middleware;

use Closure;

class AdMiddleware {

    /** * Handle an incoming request. 
     * * * @param \Illuminate\Http\Request $request 
     * * @param \Closure $next * @return mixed */
    public function handle($request, Closure $next) { // Test to see if the requesters have an ip address. 
        if ($request->ip() == null) {
            throw new \Exception("IP ADDRESS NOT SET");
        } $country = file_get_contents('http://api.hostip.info/get_html.php?ip=' . $request->ip());
        echo $country;
        if (strpos($country, "UNITED STATES")) {
            throw new \Exception("NOT FOR YOUR EYES, NSA");
        } else {
            return redirect("index");
        } return $next($request);
    }

}

此代码基本上接受请求,并作为示例在决定是否显示仅适用于美国的广告或适合世界其他地方的广告之前检查其位置。对于那些想要建立一个包含来自多个国家/地区的亚马逊联盟链接的网站的人来说,这可能非常有用。

请注意,您不应该在中间件部分传回任何内容,而应该将重定向传递给视图,而不是打印出我为简洁而做的事情。

注册您的中间件

注册中间件时,您有2个选择。首选是在应用程序处理的每个请求中添加要运行的中间件。您可以通过打开App \ Http \ Kernel.php并将其添加到$ middleware数组来实现,如下所示:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \App\Http\Middleware\EncryptCookies::class,
    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\VerifyCsrfToken::class,
    // our new class. 
    \App\http\Middleware\AdMiddleware::class,
];

第二种选择是让中间件只在注册路由上运行,你可以这样注册:

 <?php

    /** * The application's route middleware.
     *  * * @var array */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'ad' => \App\Http\Middleware\AdMiddleware::class,
    ];

然后将中间件添加到特定路由中,如下所示:

Route::get('/ip', ['middleware' => 'ad', function() { return "IP"; }]);