Laravel101:探索Midderwares-轻松解锁多语言功能
#php #laravel #middleware #laravel101

在上一篇文章中,我们在项目中添加了用户注册功能。在本文中,我们将重点介绍使用Laravel中的中间件的用户定义访问和限制。正确定义访问对于任何网站至关重要,因为我们想控制用户可以执行的操作。例如,正如您在上一篇文章中看到的那样,我们不希望任何人能够在我们的网站上添加一项新任务。我们可以使用中间件来实现这一目标,让我们深入研究Laravel的中间Wares。

中间

顾名思义,Middlewares就像管道一样是我们对服务器的请求和服务器响应之间的命令。您可能会熟悉上一课的身份中间件。

让我们回到我们的项目。如果您导航到app/Http/Middleware目录,则会找到一些预定义的中间。例如,其中一种中间件是PreventRequestsDuringMaintenance。当您激活此中间件时,用户将遇到503错误或一条消息,表明该服务通常在您的服务上执行更新或维护期间不可用。

在Laravel中,php artisan down命令用于激活此模式,而php artisan up用于阻止它:

正如您在下面的PIC中看到的时,当您的应用处于维护模式时,中间件可以防止执行任何请求:

Image description

当然,也可以从维护模式中排除特定端点,以便您需要将所需的端点添加到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”,这是结果:

Image description

在翻译方面,有一些技巧可以派上用场。一种有用的技术是使用getLocale函数在HTML标签中设置语言,例如:

<html lang="{{ app()->getLocale() }}">

另一个有用的功能是能够在翻译中包含动态值:

通过将键值对的数组作为第二个参数传递给助手函数,您可以指定要用于动态值的键。例如:

__('hello', ['user' => $username])

在上面的示例中,为此目的定义了密钥“用户”,使您可以动态插入$username

Image description

还有一个称为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');

要在导航刀片文件中显示语言选择菜单,您可以添加以下代码:

Image description

上面提到的菜单允许用户向服务器发送请求以指示其所需的语言。但是,还有更多的工作要做。我们需要从服务器上的每个请求中检索所选的语言,并且可以使用中间件来实现:

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);
}

在这里,我们使用两个对象:SessionApp,它在全球定义,可与session()app()访问,您可以从请求访问会话,例如$request->session()

应用程序立面是一个强大的对象,使我们能够在项目中使用各种服务。今天,我们将使用它来设置应用程序的语言环境。

该会话提供了一种方便而直接的方法,可访问当前用户请求的特定数据。在Laravel中,您有多个用于管理会话数据的选项,包括文件,redis,加密的cookie和数据库。默认情况下,Laravel配置为使用文件会话驱动程序,该驱动程序适用于许多应用程序。在我们的情况下,我们使用会话来存储用户的语言环境。

现在,打开位于app/Http目录中的Kernel文件,并将此中间件添加到$middlewareGroups数组和Web组的末端,因为此处定义的会话驱动程序,如下:

protected $middlewareGroups = [
  'web' => [
    // Other middleware entries...
    \App\Http\Middleware\LanguageMiddleware::class,
  ]
];

就是这样!通过遵循以下步骤,您将拥有一个多语言站点,您可以在其中定义各自语言文件夹中的翻译键。最终输出将如下:

Image description

很棒ð!

在本教程中,我们探索了Laravel Middlewares,并发现它们如何用于增强我们的应用,尤其是在实现多语言功能方面。

我希望您发现这个教程有帮助,愉快的编码!