在上一篇文章中,我们在项目中添加了用户注册功能。在本文中,我们将重点介绍使用Laravel中的中间件的用户定义访问和限制。正确定义访问对于任何网站至关重要,因为我们想控制用户可以执行的操作。例如,正如您在上一篇文章中看到的那样,我们不希望任何人能够在我们的网站上添加一项新任务。我们可以使用中间件来实现这一目标,让我们深入研究Laravel的中间Wares。
中间
顾名思义,Middlewares就像管道一样是我们对服务器的请求和服务器响应之间的命令。您可能会熟悉上一课的身份中间件。
让我们回到我们的项目。如果您导航到app/Http/Middleware
目录,则会找到一些预定义的中间。例如,其中一种中间件是PreventRequestsDuringMaintenance
。当您激活此中间件时,用户将遇到503错误或一条消息,表明该服务通常在您的服务上执行更新或维护期间不可用。
在Laravel中,php artisan down
命令用于激活此模式,而php artisan up
用于阻止它:
正如您在下面的PIC中看到的时,当您的应用处于维护模式时,中间件可以防止执行任何请求:
当然,也可以从维护模式中排除特定端点,以便您需要将所需的端点添加到except
数组中:
class PreventRequestsDuringMaintenance extends Middleware
{
/**
* The URIs that should be reachable while maintenance mode is enabled.
*
* @var array<int, string>
*/
protected $except = [
//
];
}
如果您回想起上一个教程,您可以了解到使用middleware
函数将中间件添加到端点。同样,您可以使用group
函数将中间件添加到一组路由中,如下所示。
// one route
Route::post('logout', LogoutController::class)->middleware('auth');
// or a group of routes
Route::group(['middleware' => 'auth'], function () {
Route::resource('tasks', TaskController::class);
Route::post('logout', LogoutController::class)->name('logout');
});
创建一个新的中间件
要创建自定义中间件,我们将使用以下工匠命令:
php artisan make:middleware <NameOfMiddleware>
在Laravel中,每个中间件都有一个handler
功能,您可以在其中定义其逻辑。此功能需要两个输入:请求对象和封闭。请求对象允许您在请求中访问数据,而关闭是可以调用中间件管道的功能:
public function handle(Request $request, Closure $next)
{
return $next($request);
}
要使用此中间件,我们需要在位于HTTP文件夹中的kernel.php
文件中定义它。让我们仔细看看kernel.php
文件。它包含三个数组,每个数组都有特定目的。
第一个数组middleware
是用于全球应用于所有请求的中间Wares。
下一个数组middlewareGroups
用于将中间件应用于特定的路线组。
最后,我们有routeMiddleware
阵列。在此数组中,使用钥匙定义了中间Wares,从而使我们可以将中间件应用于特定的路线。例如,如果您查看列表,您将看到提到的auth
,这说明了我们如何将其应用于所需路由。
现在,让我们尝试一些有趣的东西。
多语言Laravel网站
有时我们可能需要使我们的网站多语言,而Laravel提供了一种方便的工具来促进这一点。
要在Laravel中设置语言资源,我们首先需要运行以下命令:
php artisan lang:publish
运行此命令后,您会注意到,在项目的主要目录中,有一些PHP转换资源包括带有键的数组。这些键代表在任何应用程序中都可以找到的默认项。您可以将翻译添加到这些密钥中。但是,只有英语资源可能不够。可以说,我们想添加法语作为另一种语言。手动将所有文件和钥匙值翻译成法语可能很耗时,尤其是如果您不精通法语。
幸运的是,还有另一种方法!您可以将laravel-lang包添加到您的项目中,以简化流程。通过运行以下命令,您可以安装软件包并将法语资源添加到您的lang目录:
composer require laravel-lang/common --dev
php artisan lang:add fr
php artisan lang:update
设置了语言资源后,您可以继续为特定密钥添加翻译。例如,让我们说,我们想用英语和法语添加一个键欢迎的翻译。您可以这样做:
>> lang/en.json:
"welcome": "Welcome to Laravel101 tutorials",
>> lang/fr.json
"welcome": "Bienvenue dans les tutoriels Laravel101",
您可能想知道如何使用它,对吗?好吧,这很简单!
要使用它,您只需要在刀片文件中使用一个方便的辅助功能即可。例如,如果您的语言资源中有“欢迎”键,则可以在应用程序的主页上显示:
@extends('layouts.app')
@section('title', 'Home Page')
@section('content')
<div class="flex flex-center justify-between mb-4">
<h1 class="text-xl font-bold ">{{ __('welcome') }}</h1>
</div>
@endsection
此外,要更改应用程序的语言环境以使用特定语言,您可以修改项目的config/app.php
文件中的locale
值。现在将locale
设置为“ fr”,这是结果:
在翻译方面,有一些技巧可以派上用场。一种有用的技术是使用getLocale
函数在HTML标签中设置语言,例如:
<html lang="{{ app()->getLocale() }}">
另一个有用的功能是能够在翻译中包含动态值:
通过将键值对的数组作为第二个参数传递给助手函数,您可以指定要用于动态值的键。例如:
__('hello', ['user' => $username])
在上面的示例中,为此目的定义了密钥“用户”,使您可以动态插入$username
。
还有一个称为trans_choice
的函数,可让您根据给定输入选择性地翻译。它使您可以在单词的单数和复数形式之间进行选择。例如,考虑以下示例:
// translate file
return [
'model' => 'book|books'
];
// in blade:
{{ trans_choice('default.model', 1 ) }}
>>> book
{{ trans_choice('default.model', 2 ) }}
>>> books
太好了!我们涵盖了翻译文件的基础知识和Laravel为语言管理提供的工具。现在,让我们探索如何使用Laravel中的函数和会话根据用户选择动态设置语言。
假设我们网站的默认语言是英语,我们可以配置语言并使用config
文件中的助手函数定义必要的翻译键。
要处理用户的语言选择,我们可以创建一个名为LocaleController
的控制器,并定义store
函数如下:
use Illuminate\Http\Request;
class LocaleController extends Controller
{
public function __invoke(Request $request)
{
session(['locale' => $request->locale]);
return redirect()->back();
}
}
要访问此功能,我们定义了一个适当的路线:
Route::post('/locale', LocaleController::class)->name('locale.store');
要在导航刀片文件中显示语言选择菜单,您可以添加以下代码:
上面提到的菜单允许用户向服务器发送请求以指示其所需的语言。但是,还有更多的工作要做。我们需要从服务器上的每个请求中检索所选的语言,并且可以使用中间件来实现:
php artisan make:middleware SwitchLocaleMiddleware
执行命令后,导航到app/Http/Middleware
目录并定义中间件如下:
public function handle(Request $request, Closure $next): Response
{
if (Session::has('locale'))
App::setLocale(Session::get('locale'));
return $next($request);
}
在这里,我们使用两个对象:Session
和App
,它在全球定义,可与session()
和app()
访问,您可以从请求访问会话,例如$request->session()
应用程序立面是一个强大的对象,使我们能够在项目中使用各种服务。今天,我们将使用它来设置应用程序的语言环境。
该会话提供了一种方便而直接的方法,可访问当前用户请求的特定数据。在Laravel中,您有多个用于管理会话数据的选项,包括文件,redis,加密的cookie和数据库。默认情况下,Laravel配置为使用文件会话驱动程序,该驱动程序适用于许多应用程序。在我们的情况下,我们使用会话来存储用户的语言环境。
现在,打开位于app/Http
目录中的Kernel
文件,并将此中间件添加到$middlewareGroups
数组和Web组的末端,因为此处定义的会话驱动程序,如下:
protected $middlewareGroups = [
'web' => [
// Other middleware entries...
\App\Http\Middleware\LanguageMiddleware::class,
]
];
就是这样!通过遵循以下步骤,您将拥有一个多语言站点,您可以在其中定义各自语言文件夹中的翻译键。最终输出将如下:
很棒ð!
在本教程中,我们探索了Laravel Middlewares,并发现它们如何用于增强我们的应用,尤其是在实现多语言功能方面。
我希望您发现这个教程有帮助,愉快的编码!