标签: laravel

  • 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 11 运行报错 could not find driver (Connection: sqlite, SQL: PRAGMA foreign_keys = ON;)

    错误信息:could not find driver (Connection: sqlite, SQL: PRAGMA foreign_keys = ON;)

    原因是Laravel 11 默认使用 sqlite 作为数据库,而你的服务器上又没装php的sqlite扩展,所以报错。

    解决办法,安装sqlite3扩展:

    apt update
    apt install php8.3-sqlite3

    注意php版本号。

  • 更新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 发布分页视图

    有时,需要对分页代码进行自定义,那么此时就需要把分页视图发布出来:

    php artisan vendor:publish --tag=laravel-pagination

  • 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中model转成JSON,日期时间中带T的问题

    在model中添加以下代码:

    protected function serializeDate(DateTimeInterface $date): string
    {
    	return $date->format('Y-m-d H:i:s');
    }

    注意,需要引用:use DateTimeInterface;

  • 从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这个文件。