错误信息: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版本号。
错误信息: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 installer来安装框架,那么当需要更新laravel installer时可以执行以下命令:
composer global remove laravel/installer
composer global require laravel/installer
你大概看出来了,对!就是卸载然后重装,就是这么简单又暴力,喜欢吗?
该标题的意思即: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 应用程序中使用自己的身份验证系统来管理不同类型的用户。
参考文章:
把以下代码放在 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>
有时,需要对分页代码进行自定义,那么此时就需要把分页视图发布出来:
php artisan vendor:publish --tag=laravel-pagination
不解释了,有需要的人会懂。
<?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();
}
}
在model中添加以下代码:
protected function serializeDate(DateTimeInterface $date): string
{
return $date->format('Y-m-d H:i:s');
}
注意,需要引用:use DateTimeInterface;
这个表是laravel/sanctum这个包带的,Laravel Sanctum 是 Laravel 官方推出的一个轻量级的身份验证系统,专门用于为单页应用(SPA)、移动应用以及简单的 token-based API 提供身份验证解决方案,它提供了一种简洁且安全的方式来处理用户身份验证。
如果不需要,当然可以删除,执行下面的命令把它干掉:
composer remove laravel/sanctum
如果要支持多语言i18n,可以使用laravel-lang这个包,操作如下:
php artisan lang:publish
composer require laravel-lang/common
php artisan lang:update
php artisan lang:add zh_CN
翻译文件在lang文件夹下
如果要支持多语言切换,可以通过中间件实现:
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这个文件。
编辑nginx的网站配置文件,在location / {} 里面添加如下代码:
try_files $uri $uri/ /index.php?$query_string;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
有时,需要判断一个请中的某个字段是否为空,可以使用filled函数进行,代码如下:
if ($request->filled('keyword')) {
dd('keyword is not empty.');
}else {
dd('keyword is empty.');
}
作为一个全栈开发框架,Laravel的模型默认启用created_at和update_at字段的,有些情况下,我们并不想启用这两个字段,例如使用已经设计好的数据库,此时,只需要在模型中添加如下属性即可:
public $timestamps = false;
嗯,超级简单,代码还没有描述文字多🤔。