Статья перепечатана с: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 поставляется с большинством этих промежуточных программ, например.ValidatePostSize
, TrimStrings
,CheckForMaintenanceMode
и т.п.
Промежуточное программное обеспечение маршрутизации работает только на тех маршрутах, к которым оно подключено.
напримерredirectIfAuthenticated
.
зарегистрировать промежуточное ПО
Любое созданное промежуточное ПО должно быть зарегистрировано, так как это единственный способ, которым Laravel знает о его существовании. Чтобы зарегистрировать промежуточное ПО, просто откройте файл с именемkernel.php
, который находится в папке Http следующим образом:
Этот файл содержит список всех зарегистрированных промежуточных программ, которые поставляются с 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…