标签归档:Laravel

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

laravel 模型中禁用update_at和created_at字段

作为一个全栈开发框架,Laravel的模型默认启用created_at和update_at字段的,有些情况下,我们并不想启用这两个字段,例如使用已经设计好的数据库,此时,只需要在模型中添加如下属性即可:

public $timestamps = false;

嗯,超级简单,代码还没有描述文字多🤔。