[Учебник] Промежуточное ПО Laravel на местном языке

PHP

Laravel

Статья перепечатана с:Learncool.com/la-ravel/he/2…

Что такое промежуточное ПО Laravel?

Короче говоря, роль промежуточного программного обеспечения в laravel заключается в фильтрации HTTP-запросов и выполнении различных логических операций в соответствии с разными запросами.

С помощью промежуточного программного обеспечения мы можем реализовать следующие функции:

  • указать определенные маршруты
  • Установить заголовки ответа HTTP
  • запрос журнала
  • фильтровать параметры запроса
  • Решите, следует ли включить режим обслуживания сайта
  • Выполните некоторые необходимые операции до и после ответа

пользовательское промежуточное ПО

Вы можете легко создать новое промежуточное ПО, выполнив следующую простую команду из командной строки.

php artisan make:middleware <MiddlewareName>
//MiddlewareName 就是你要创建的中间件的名字

Выполните указанную выше команду, Laravelapp/Http/MiddlewareКаталог, содержащий толькоhandleПромежуточное ПО метода.

<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

Когда промежуточное ПО вызывается,handleметод будет выполнен. Здесь следует отметить, чтоhandleМетод имеет два параметра по умолчанию$request и $next$requestИспользуется для принятия группового запроса приложения,$nextПередать запрос в приложение. Эти два параметраhandleнеобходимый! ПО промежуточного слоя также включает ПО промежуточного слоя и ПО промежуточного слоя.

«Front middleware», как следует из названия, обрабатывает некоторую логику перед пересылкой запроса в приложение. Промежуточное ПО After, с другой стороны, запускается после того, как приложение обработало запрос и сгенерировало ответ.

Предварительное промежуточное ПО:

<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        //你的逻辑就在这里
        return $next($request);
    }
}

Сообщение промежуточного программного обеспечения:

<?php
namespace App\Http\Middleware;
use Closure;
class RedirectIfSuperAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);
        //你的逻辑就在这里 例如 重定向到  `/`

        return $response;
    }
}

Типы промежуточного программного обеспечения

  • глобальное промежуточное ПО
  • промежуточное ПО маршрутизации

Глобальное промежуточное ПО запускается для каждого запроса, поступающего в приложение. Laravel поставляется с большинством этих промежуточных программ, например.ValidatePostSizeTrimStrings,CheckForMaintenanceMode и т.п.

Промежуточное программное обеспечение маршрутизации работает только на тех маршрутах, к которым оно подключено. напримерredirectIfAuthenticated.

зарегистрировать промежуточное ПО

Любое созданное промежуточное ПО должно быть зарегистрировано, так как это единственный способ, которым Laravel знает о его существовании. Чтобы зарегистрировать промежуточное ПО, просто откройте файл с именемkernel.php, который находится в папке Http следующим образом:

Laravel

Этот файл содержит список всех зарегистрированных промежуточных программ, которые поставляются с Laravel по умолчанию, он содержит три основных массива, которые Этот файл содержит список всех зарегистрированных промежуточных программ, предоставляемых Laravel по умолчанию. Он содержит три основные группы промежуточного программного обеспечения.$middleware , $middlewareGroups и $routeMiddleware

<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
    /**
     * 应用程序的全局HTTP中间件。
     *
     * 这些中间件在应用程序的每个请求期间运行。
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];
    /**
     * 应用程序的路由中间件组.
     *
     * @var array
     */
    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',
        ],
    ];
    /**
     * 应用程序的路由中间件.
     *
     * 可以将这些中间件分配给组或单独使用。
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        //the just created middlware
        'superadmin' => \App\Http\Middleware\RedirectIfSuperAdmin::class, 
    ];
}

$middlewareМассив содержит глобальное промежуточное ПО, которое запускает каждый HTTP-запрос приложения, поэтому, если вы хотите запускать промежуточное ПО для каждого запроса, вы должны зарегистрировать его здесь. $middlewareGroupsПозволяет регистрировать ПО промежуточного слоя в группах, упрощая подключение большого количества ПО промежуточного слоя к маршрутам с помощью имени группы.$routeMiddlewareМассив содержит каждое зарегистрированное ПО промежуточного слоя маршрутизации.

промежуточное ПО для распространения

Существует два основных способа применения зарегистрированного ПО промежуточного слоя к маршрутам.

  • Через конструктор контроллера
  • путем маршрутизации

Назначить промежуточное ПО через конструктор

Существует большая гибкость в назначении промежуточных звеньев через конструктор, который предоставляет два важных метода.except($parameters) и only($parameters), которые разрешают или запрещают применение ПО промежуточного слоя к вспомогательным методам в контроллере. Без использования этих двух методов промежуточное ПО будет использовать каждый метод с контроллером.

<?php
use Illuminate\Http\Request;

class ForumController extends Controller
{

    public function __construct(){
      /**in this case the middleware named auth is applied
       to every single function within this controller
       */
        $this->middleware('auth');
    }

    public function viewForum(){

      return view('index');
    }

    public function edit($id){

    }

    public function delete($id){

    }

}

использовать except и onlyМетоды Мы можем применить промежуточное ПО к указанным методам.

<?php
use Illuminate\Http\Request;

class ForumController extends Controller
{

    public function __construct(){
      /**the authentication middleware here applies to all functions but
       viewForums() and viewForumDetails() and the opposite of this happens
       when you use only()
       */
        $this->middleware('auth')->except(['viewForums', 'viewForumDetails']);
    }

    public function viewForums(){

      return view('index');
    }

    public function edit($id){

    }

    public function delete($id){

    }

    public function viewForumDetails(){

    }
}

Распространение промежуточного ПО путем маршрутизации

Если зарегистрированное промежуточное ПО может быть подключено непосредственно к маршруту следующим образом:

<?php
//方法 1
Route::get('admin/profile', function () {
  //action
})->middleware('auth');

/**方法 2
或者像这样使用完全限定的类名:
*/
use App\Http\Middleware\CheckAge;

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

//方法 3
Route::group(['middleware' => ['web']], function () {
    //action
});

Группы промежуточного программного обеспечения N:B могут быть назначены маршрутам, как одно промежуточное программное обеспечение.

Параметры промежуточного ПО

Дополнительные параметры могут быть переданы промежуточному программному обеспечению. Типичным примером является присвоение каждому идентификатору пользователя роли, а ПО промежуточного слоя проверяет роль пользователя, чтобы определить, есть ли у него доступ к запрошенному URI. Параметры могут быть переданы промежуточному ПО следующим образом:

<?php
//方法1 (Through route)
Route::get('admin/profile', function () {
  //action
})->middleware('auth:<role>'); //<role> 这里应该被用户想要传递的任何参数替换。

//方法2 (Through a controller)
use Illuminate\Http\Request;

class ForumController extends Controller
{

    public function __construct(){
        $this->middleware('auth:<role>');
    }
  }

Промежуточному программному обеспечению можно передать несколько параметров, разделив каждый параметр запятой.

<?php
Route::get('admin/profile', function () {
  //action
})->middleware('auth:<role>,<age>,<country>'); //<role>, <age>, <country> 这里应该被用户想要传递的任何参数替换。

Эти параметры находятся в$nextЗатем переменная передается в функцию дескриптора промежуточного программного обеспечения.

<?php
class RedirectIfSuperAdmin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $role, $age, $country)
    {   
        //使用解析参数的中间件逻辑
        return $next($request);
    }
}

Суммировать

Чтобы создать промежуточное ПО, следуйте приведенной ниже процедуре.

  • Создание промежуточного программного обеспечения с помощью команд ремесленникаphp artisan make:middleware 中间件名.
  • Зарегистрируйте промежуточное ПО в kernel.php в папке app→Http.
  • Напишите логику в созданном промежуточном программном обеспечении
  • Назначьте промежуточное ПО для маршрута или контроллера

Conclusion

Промежуточное программное обеспечение Laravel упрощает защиту наших маршрутов, фильтрацию входных данных и делает множество других вещей без написания большого количества логики. Ознакомьтесь с официальной документацией Laravel.здесьУзнайте больше о возможностях промежуточного ПО и, самое главное, попрактикуйтесь.

Статья перепечатана с:Learncool.com/la-ravel/he/2…
Еще статьи:Learncool.com/pull-ravel/from/he…