Laravel 修改 API 请求前缀

本文所使用的 Laravel 大版本为 Laravel 10。

本来 Laravel 的 API 路由会默认自动带上api前缀,即类似于http://127.0.0.1:8000/api/get这样的形式,本来这种形式就挺美观的,也没有什么问题。但是遇到一个需求,要求在api前面加上一串固定的字符串,类似于http://127.0.0.1:8000/e10adc3949ba59abbe56e057f20f883e/api/get的形式。行吧,既然是客户的需求,那就改吧。

首先我们找到app/Providers/RouteServiceProvider.php这个文件,在boot函数里面修改api前缀,代码如下:

// language: php
/**
 * Define your route model bindings, pattern filters, and other route configuration.
 */
public function boot(): void
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
    });

    $this->routes(function () {
        Route::middleware('api')
            ->prefix('e10adc3949ba59abbe56e057f20f883e/api') // 👈 修改这行
            ->group(base_path('routes/api.php'));

        Route::middleware('web')
            ->group(base_path('routes/web.php'));
    });
}

这样,所有API路由的前缀就会自动变成e10adc3949ba59abbe56e057f20f883e/api。怎么样,Laravel 是不是很简单?!

后记:

时间来到2025年的2月份,这是这个月的第一篇文章,本来没什么想写的,但是再不写,这个月就要过去了,文章归档就要少一个月,就随便水一篇吧。

已经很长很长时间没有工作了,迫于经济压力,开年以来,在做网站,对,你没看错,AI时代做网站!我知道这条路大概率走不通,但是又没有什么可做的,权且当个自我安慰吧,以至于不太焦虑。前两天有一个网站通过了 Google AdSense,但看到收入后,更焦虑了,每天几只有几分钱,还是我自己浏览的。这个也没有办法,网站缺少竞争力,没有什么流量,那么没有收入也是正常的,唉,再继续完善继续优化吧。

更新laravel安装程序

如果你使用laravel installer来安装框架,那么当需要更新laravel installer时可以执行以下命令:

composer global remove laravel/installer
composer global require laravel/installer

你大概看出来了,对!就是卸载然后重装,就是这么简单又暴力,喜欢吗?

laravel 前后台分别登录,互不影响

该标题的意思即:Laravel 中的多重身份验证,简化了一下标题,让人能看懂。

在 Laravel 中,“多重身份验证”(也称为“多重保护身份验证”)是指在单个应用程序中管理多个用户身份验证系统的能力。当您有不同类型的用户(例如普通用户和管理员)且每个用户都有自己的身份验证要求和用户模型时,这非常有用。

要在 Laravel 中实现多重身份验证,您通常需要遵循以下步骤:

第 1 步:创建多个用户模型:

为要验证的每种类型的用户创建单独的用户模型。例如,您可能有一个User针对普通用户的模型和一个Admin针对管理员的模型。您可以使用以下artisan命令生成这些模型:

php artisan make:model User  
php artisan make:model Admin

注意:这一步可以省略,完全可以都用User表。

步骤 2:配置身份验证防护:

在config/auth.php文件中,定义多个防护(guard),每个防护与一个用户模型关联。Laravel 允许您为每个守卫配置不同的身份验证驱动程序。例如,您可以将“web”防护用于具有基于会话的身份验证的普通用户,将“admin”防护用于具有基于会话或基于令牌的身份验证的管理员。

下面是一个简化的文件示例config/auth.php:

'guards' => [  
	'web' => [  
		'driver' => 'session',  
		'provider' => 'users',  
	],  
  
	'admin' => [  
		'driver' => 'session',  
		'provider' => 'admins',  
	],  
],

第 3 步:定义身份验证提供程序:

为每个用户模型配置身份验证提供程序。提供者决定 Laravel 应在何处检索用户记录。在同一config/auth.php文件中,为指定相应 Eloquent 模型的“users”和“admins”定义提供程序:

'providers' => [  
	'users' => [  
		'driver' => 'eloquent',  
		'model' => App\Models\User::class,  
	],  
	  
	'admins' => [  
		'driver' => 'eloquent',  
		'model' => App\Models\Admin::class,  
	],  
],

第 4 步:实施身份验证逻辑:

在你的应用程序中,根据所选的防护实现身份验证逻辑。你可以使用auth()辅助方法来访问所需的防护:

// Authenticate a regular user  
if (auth()->guard('web')->attempt(['email' => $email, 'password' => $password])) {  
	// User is logged in  
}  
  
// Authenticate an administrator  
if (auth()->guard('admin')->attempt(['email' => $email, 'password' => $password])) {  
	// Admin is logged in  
}

第 5 步:保护路由:

使用中间件根据所选的防护来保护路由。例如,您可以应用“auth:web”中间件来保护普通用户的路由,使用“auth:admin”中间件来保护管理员的路由:

Route::middleware(['auth:web'])->group(function () {  
	// Routes accessible to regular users  
});  
  
Route::middleware(['auth:admin'])->group(function () {  
	// Routes accessible to administrators  
});

第 6 步:注销:

要注销用户,可以logout在相应的守卫上使用该方法:

auth()->guard('web')->logout(); // Log out a regular user  
auth()->guard('admin')->logout(); // Log out an administrator 

结论:

这就是 Laravel 中实现多重身份验证的基本流程。你可以创建多个用户模型(或者只用User模型),配置防护和提供程序,实施身份验证逻辑,并根据所选防护保护路由。这允许你在单个 Laravel 应用程序中使用自己的身份验证系统来管理不同类型的用户。

参考文章:

https://sagardhiman021.medium.com/exploring-multi-authentication-in-laravel-a-step-by-step-guide-to-implementation-edd3bf304fce

laravel 使用 layui 分页样式

把以下代码放在 views/vendor/pagination/layui.blade.php里,这个路径是使用 php artisan vendor:publish --tag=laravel-pagination 发布出来的:

<div class="layui-box layui-laypage layui-laypage-default">  
  
    {{-- Previous Page Link --}}  
    @if ($paginator->onFirstPage())  
        <a class="layui-laypage-prev layui-disabled">上一页</a>  
  
    @else  
        <a class="layui-laypage-prev" href="{{ $paginator->previousPageUrl() }}">上一页</a>  
  
    @endif  
  
  
    {{-- Pagination Elements --}}  
    @foreach ($elements as $element)  
        {{-- Array Of Links --}}  
        @if (is_array($element))  
            @foreach ($element as $page => $url)  
                @if ($page == $paginator->currentPage())  
                    <span class="layui-laypage-curr"><em class="layui-laypage-em"></em><em>{{ $page }}</em></span>  
                @else  
                    <a href="{{ $url }}">{{ $page }}</a>  
                @endif  
            @endforeach        @endif    @endforeach  
    {{-- Next Page Link --}}  
    @if ($paginator->hasMorePages())  
        <a class="layui-laypage-next" href="{{ $paginator->nextPageUrl() }}">下一页</a>  
    @else  
        <a class="layui-laypage-next  layui-disabled" href="{{ $paginator->nextPageUrl() }}">下一页</a>  
    @endif  
  
  
</div>

使用:

<div style="text-align: center">  
    {{ $rooms->links('vendor.pagination.layui') }}  
</div>

补充一个Layui2.9.x的样式:

<div class="layui-box layui-laypage layui-laypage-default">  
  
    {{-- Previous Page Link --}}  
    @if ($paginator->onFirstPage())  
        <a class="layui-laypage-prev layui-disabled">上一页</a>  
  
    @else  
        <a class="layui-laypage-prev" href="{{ $paginator->previousPageUrl() }}">上一页</a>  
  
    @endif  
  
  
    {{-- Pagination Elements --}}  
    @foreach ($elements as $element)  
        {{-- Array Of Links --}}  
        @if (is_array($element))  
            @foreach ($element as $page => $url)  
                @if ($page == $paginator->currentPage())  
                    <span class="layui-laypage-curr"><em class="layui-laypage-em"></em><em>{{ $page }}</em></span>  
                @else  
                    <a href="{{ $url }}">{{ $page }}</a>  
                @endif  
            @endforeach        @endif    @endforeach  
    {{-- Next Page Link --}}  
    @if ($paginator->hasMorePages())  
        <a class="layui-laypage-next" href="{{ $paginator->nextPageUrl() }}">下一页</a>  
    @else  
        <a class="layui-laypage-next  layui-disabled" href="{{ $paginator->nextPageUrl() }}">下一页</a>  
    @endif  
  
  
</div>

laravel api resource 返回数组

不解释了,有需要的人会懂。

<?php

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;

class GuestbookCollection extends ResourceCollection
{
    /**
     * Transform the resource collection into an array.
     *
     * @return array<int|string, mixed>
     */
    public function toArray(Request $request): array
    {
        return $this->collection->map(function ($item){
            return [
                'username' => $item->user->username,
                'content' => $item->content,
                'created_at' => $item->created_at->format('Y-m-d H:i:s'),
                'reply_content' => $item->reply->content,
                'id' => $item->id,

            ];
        })->toArray();
    }
}

从laravel 中删除 personal_access_tokens 表

这个表是laravel/sanctum这个包带的,Laravel Sanctum 是 Laravel 官方推出的一个轻量级的身份验证系统,专门用于为单页应用(SPA)、移动应用以及简单的 token-based API 提供身份验证解决方案,它提供了一种简洁且安全的方式来处理用户身份验证。

如果不需要,当然可以删除,执行下面的命令把它干掉:

composer remove laravel/sanctum

Laravel多语言支持

如果要支持多语言i18n,可以使用laravel-lang这个包,操作如下:

php artisan lang:publish 
composer require laravel-lang/common
php artisan lang:update
php artisan lang:add zh_CN

翻译文件在lang文件夹下

Laravel多语言文夹

如果要支持多语言切换,可以通过中间件实现:

php artisan make:middleware LanguageMiddleware

填写以下代码:

public function handle(Request $request, Closure $next): Response
{
	if(session()->has('locale'))
		app()->setLocale(session('locale'));
	else
		app()->setLocale(config('app.locale'));
	return $next($request);
}

HomeController中

public function setLocale($locale)
{
	session(['locale' => $locale]);
	return redirect()->back();
}

路由:

Route::get('/setLocale/{locale}', [HomeController::class, 'setLocale'])->name('home.setLocale');

视图:

<ul class="menu">
	<li><a href="{{ route('home.setLocale', ['locale'=>'zh_CN']) }}"><h3>简体中文</h3></a></li>
	<li><a href="{{ route('home.setLocale', ['locale'=>'en']) }}"><h3>English</h3></a></li>
</ul>

文本的翻译用法:

{{ __('iretailer.sign_out') }}

这句话的意思是在iretailer.php文件中找sign_out这个配置。当然,不要忘了在不同的语言文件夹中iretailer.php这个文件。