面向 WEB 工匠的 PHP 框架。
注意:本文档只摘取 Laravel 官方文档 的部分常用功能。框架功能庞大,但我们通常只会用到其中很小的一部分。
入门
安装
通过 Composer 安装
composer create-project laravel/laravel example-appcd example-appphp artisan serve
一旦您启动了 Artisan 开发服务器,您就可以在 http://localhost:8000 进行访问。
目录结构
├── app // 应用程序| ├── Broadcasting // 广播| ├── Console // Artisan命令| ├── Events // 事件| ├── Exceptions // 异常| ├── Http // 请求| ├── Jobs // 队列| ├── Listeners // 事件监听| ├── Mail // 电子邮件| ├── Models // Eloquent模型| ├── Notifications // 消息通知| ├── Policies // 授权策略| ├── Providers // 服务提供者| └── Rules // 验证规则├── bootstrap // 引导程序├── config // 配置文件├── database // 数据库├── lang // 语言包├── public // 公共目录├── resources // 静态资源├── routes // 路由├── storage // 存储生成文件├── tests // 自动化测试├── vendor // Composer包
部署
服务器要求
- PHP >= 8.0
- BCMath PHP 扩展
- Ctype PHP 扩展
- cURL PHP 扩展
- DOM PHP 扩展
- Fileinfo PHP 扩展
- JSON PHP 扩展
- Mbstring PHP 扩展
- OpenSSL PHP 扩展
- PCRE PHP 扩展
- PDO PHP 扩展
- Tokenizer PHP 扩展
- XML PHP 扩展
服务器配置
Nginx
server {listen 80;listen [::]:80;server_name example.com;root /srv/example.com/public;add_header X-Frame-Options "SAMEORIGIN";add_header X-Content-Type-Options "nosniff";index index.php;charset utf-8;location / {try_files $uri $uri/ /index.php?$query_string;}location = /favicon.ico { access_log off; log_not_found off; }location = /robots.txt { access_log off; log_not_found off; }error_page 404 /index.php;location ~ \.php$ {fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;include fastcgi_params;}location ~ /\.(?!well-known).* {deny all;}}
优化
优化自动加载
Composer 的类自动加载器映射,以便 Composer 可以快速找到要为给定类加载的正确文件。
composer install --optimize-autoloader --no-dev
优化配置加载
所有配置文件合并到一个缓存文件中,减少框架在加载配置值时必须访问文件系统的次数。
php artisan config:cache
优化路由加载
所有路由注册减少到缓存文件中的单个方法调用中,从而在注册数百条路由时提高路由注册的性能。
php artisan route:cache
优化视图加载
预编译所有 Blade 视图,因此它们不会按需编译,从而提高每个返回视图的请求的性能。
php artisan view:cache
关闭调试模式
在生产环境中,APP_DEBUG 应该始终为 false。
核心架构
请求生命周期

下面对应的代码,解释上图。
// 文件路径:public/index.php/*** 定义框架启动时间*/define('LARAVEL_START', microtime(true));/*** 检查应用程序是否处于维护模式*/if (file_exists($maintenance = __DIR__.'/../storage/framework/maintenance.php')) {require $maintenance;}/*** 注册自动加载*/require __DIR__.'/../vendor/autoload.php';/*** 运行应用程序*/$app = require_once __DIR__.'/../bootstrap/app.php';$kernel = $app->make(Kernel::class);$response = $kernel->handle($request = Request::capture())->send();$kernel->terminate($request, $response);
// 文件路径:bootstrap/app.php/*** 创建应用程序*/$app = new Illuminate\Foundation\Application($_ENV['APP_BASE_PATH'] ?? dirname(__DIR__));/*** 绑定内核*/$app->singleton(Illuminate\Contracts\Http\Kernel::class,App\Http\Kernel::class);$app->singleton(Illuminate\Contracts\Console\Kernel::class,App\Console\Kernel::class);$app->singleton(Illuminate\Contracts\Debug\ExceptionHandler::class,App\Exceptions\Handler::class);/*** 返回应用程序*/return $app;
// 文件路径:vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.phpclass Kernel implements KernelContract{protected $bootstrappers = [\Illuminate\Foundation\Bootstrap\LoadEnvironmentVariables::class, // 注册应用环境配置\Illuminate\Foundation\Bootstrap\LoadConfiguration::class, // 注册应用配置\Illuminate\Foundation\Bootstrap\HandleExceptions::class, // 注册异常\Illuminate\Foundation\Bootstrap\RegisterFacades::class, // 注册门面模式\Illuminate\Foundation\Bootstrap\RegisterProviders::class, // 注册服务提供者\Illuminate\Foundation\Bootstrap\BootProviders::class, // 注册引导程序];/*** 处理请求*/public function handle($request){try {$request->enableHttpMethodParameterOverride();$response = $this->sendRequestThroughRouter($request);} catch (Throwable $e) {$this->reportException($e);$response = $this->renderException($request, $e);}$this->app['events']->dispatch(new RequestHandled($request, $response));return $response;}/*** 通过中间件/路由发送请求*/protected function sendRequestThroughRouter($request){$this->app->instance('request', $request);Facade::clearResolvedInstance('request');$this->bootstrap();return (new Pipeline($this->app))->send($request)->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)->then($this->dispatchToRouter());}/*** 引导应用程序** @return void*/public function bootstrap(){if (! $this->app->hasBeenBootstrapped()) {$this->app->bootstrapWith($this->bootstrappers());}}/*** 路由分发*/protected function dispatchToRouter(){return function ($request) {$this->app->instance('request', $request);return $this->router->dispatch($request);};}/*** 终止应用程序*/public function terminate($request, $response){$this->terminateMiddleware($request, $response);$this->app->terminate();}}
服务容器
服务容器是管理类依赖和执行依赖注入的强大工具。依赖注入是一个花哨的短语,本质上是这样的:类依赖通过构造函数或在某些情况下的“setter”方法“注入”到类中。
让我们看一个简单的例子:
<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use App\Repositories\UserRepository;use App\Models\User;class UserController extends Controller{/*** 用户存储库实现** @var UserRepository*/protected $users;/*** 创建一个新的控制器实例** @param UserRepository $users* @return void*/public function __construct(UserRepository $users){$this->users = $users;}/*** 显示给定用户的信息** @param int $id* @return Response*/public function show($id){$user = $this->users->find($id);return view('user.profile', ['user' => $user]);}}
绑定
几乎所有服务容器绑定都会在 服务提供者 中注册。在服务提供者中,您始终可以通过 $this->app 属性访问容器。我们可以使用 bind 方法注册绑定,bind 方法的第一个参数为要绑定的类或接口名称,第二个参数是一个返回类实例的闭包:
// 简单绑定$this->app->bind(Transistor::class, function ($app) {return new Transistor($app->make(PodcastParser::class));});// 绑定单例$this->app->singleton(Transistor::class, function ($app) {return new Transistor($app->make(PodcastParser::class));});// 绑定作用域单例$this->app->scoped(Transistor::class, function ($app) {return new Transistor($app->make(PodcastParser::class));});// 绑定实例$service = new Transistor(new PodcastParser);$this->app->instance(Transistor::class, $service);// 绑定接口到实现$this->app->bind(EventPusher::class, RedisEventPusher::class);// 绑定上下文$this->app->when(PhotoController::class)->needs(Filesystem::class)->give(function () {return Storage::disk('local');});// 绑定原语$this->app->when('App\Http\Controllers\UserController')->needs('$variableName')->give($value);// 绑定扩展$this->app->extend(Service::class, function ($service, $app) {return new DecoratedService($service);});
解析
您可以使用 make 方法从容器中解析类实例。make 方法接受您希望解析的类或接口的名称:
$transistor = $this->app->make(Transistor::class);
容器事件
服务容器每次解析对象时都会触发一个事件。您可以使用 resolving 方法侦听此事件:
$this->app->resolving(Transistor::class, function ($transistor, $app) {// 当容器解析 "Transistor" 类型的对象时调用...});$this->app->resolving(function ($object, $app) {// 当容器解析任何类型的对象时调用...});
服务提供者
服务提供者是所有 Laravel 应用程序的引导中心。您自己的应用程序,以及 Laravel 的所有核心服务,都是通过服务提供者引导的。
“引导”可以理解为注册,包括注册服务容器绑定、事件监听器、中间件,甚至路由。
如果您打开 Laravel 的 config/app.php 文件时,您会看到一个 providers 数组。这些是应用程序加载的所有服务提供者类。默认情况下,数组中列出了一组 Laravel 核心服务提供者。这些提供者引导 Laravel 核心组件,例如邮件、队列、缓存等。其中许多是“延迟”提供者,这意味着它们不会在每个请求上加载,而只会在实际需要它们提供服务时加载。
编写服务提供者
所有服务提供者都会继承 Illuminate\Support\ServiceProvider 类。大多数服务提供者都包含一个 register 和一个 boot 方法。在 register 方法中,您应该只将服务绑定到 服务容器 中。您永远不应该尝试在 register 方法中注册任何事件侦听器、路由或任何其他功能。
Artisan CLI 可以通过 make:provider 命令生成新的提供者:
php artisan make:provider RiakServiceProvider
注册方法
<?phpnamespace App\Providers;use App\Services\Riak\Connection;use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider{/*** 注册任何应用程序服务** @return void*/public function register(){$this->app->singleton(Connection::class, function ($app) {return new Connection(config('riak'));});}}
引导方法
<?phpnamespace App\Providers;use Illuminate\Support\Facades\View;use Illuminate\Support\ServiceProvider;class ComposerServiceProvider extends ServiceProvider{/*** 引导任何应用程序服务** @return void*/public function boot(){View::composer('view', function () {//});}}
注册服务提供者
所有服务提供者都在 config/app.php 配置文件中注册。
'providers' => [// 其他服务提供者App\Providers\ComposerServiceProvider::class,],
延迟服务提供者
延迟加载服务提供者将提高应用程序的性能,因为它不是在每次请求时都从文件系统加载的。
要延迟加载提供者,需要实现 \Illuminate\Contracts\Support\DeferrableProvider 接口并定义 provides 方法。provides 方法应返回提供者注册的服务容器绑定:
<?phpnamespace App\Providers;use App\Services\Riak\Connection;use Illuminate\Contracts\Support\DeferrableProvider;use Illuminate\Support\ServiceProvider;class RiakServiceProvider extends ServiceProvider implements DeferrableProvider{/*** 注册任何应用程序服务** @return void*/public function register(){$this->app->singleton(Connection::class, function ($app) {return new Connection($app['config']['riak']);});}/*** 获取提供者提供的服务** @return array*/public function provides(){return [Connection::class];}}
Facades
Laravel Facades 充当服务容器中底层类的“静态代理”,提供简洁、富有表现力的语法,同时保持比传统静态方法更多的可测试性和灵活性。
Facades Vs. 依赖注入
依赖注入的主要好处之一是能够交换注入类的实现。这在测试期间很有用,因为您可以注入 mock 或 stub 并断言在 stub 上调用了各种方法。
use Illuminate\Support\Facades\Cache;Route::get('/cache', function () {return Cache::get('key');});
使用 Laravel Facades 测试方法,我们可以编写以下测试来验证 Cache::get 方法是否使用我们期望的参数调用:
use Illuminate\Support\Facades\Cache;/*** 一个基本的功能测试示例** @return void*/public function testBasicExample(){Cache::shouldReceive('get')->with('key')->andReturn('value');$response = $this->get('/cache');$response->assertSee('value');}
Facades Vs. 辅助函数
除了 Facades 之外,Laravel 还包括各种辅助函数,它们可以执行常见任务,例如生成视图、触发事件、调度作业或发送 HTTP 响应。许多辅助函数执行与对应 Facades 具有相同的作用。
Facades 工作原理
Facades 是一个提供从容器访问对象的类。Facade 基类 Illuminate\Support\Facades\Facade 使用 __callStatic() 魔术方法将来自 Facade 的调用推迟到从容器解析出对象后。
下面的示例中,调用了 Laravel 缓存系统。看一眼这段代码,人们可能会认为 get 正在 Cache 类上调用静态方法:
<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\Cache;class UserController extends Controller{/*** 显示给定用户的信息** @param int $id* @return Response*/public function showProfile($id){$user = Cache::get('user:'.$id);return view('profile', ['user' => $user]);}}
请注意,在文件顶部附近,我们正在导入了 Cache Facade 。这个 Facade 充当访问Illuminate\Contracts\Cache\Factory 接口底层实现的代理。我们使用 Facade 进行的任何调用都将传递给 Laravel 缓存服务的底层实例。
如果我们查看 Illuminate\Support\Facades\Cache 类,您会发现没有静态方法 get :
class Cache extends Facade{/*** 获取组件的注册名称** @return string*/protected static function getFacadeAccessor() { return 'cache'; }}
相反,Cache Facade 继承了 Facade 基类并定义了 getFacadeAccessor() 方法。此方法的工作是返回服务容器绑定的名称。当用户引用 Cache Facade 上的任何静态方法时,Laravel 会从 服务容器 解析绑定 cache 并针对该对象运行请求的方法(在本例中为 get 方法)。
实时 Facades
使用实时 Facade,您可以将应用程序中的任何类视为 Facade。
要生成实时 Facade,请在导入类的命名空间前加上 Facades:
<?phpnamespace App\Models;use Facades\App\Contracts\Publisher;use Illuminate\Database\Eloquent\Model;class Podcast extends Model{/*** 发布 podcast** @return void*/public function publish(){$this->update(['publishing' => now()]);Publisher::publish($this);}}
当使用实时 Facade 时,publisher 实现将使用出现在 Facades 前缀之后的接口或类名部分从服务容器中解析出来。
Facade 类参考
您将在下面找到每个 Facade 类及其底层类。这是一个有用的工具,可以快速查找 Facade 类的 API 文档。而且还包括 服务容器绑定。
基础功能
路由
基本路由
Route::get('/users', [UserController::class, 'index']);
可用的路由方法:
Route::get($uri, $callback);Route::post($uri, $callback);Route::put($uri, $callback);Route::patch($uri, $callback);Route::delete($uri, $callback);Route::options($uri, $callback);
路由参数
Route::get('/users/{id}', [UserController::class, 'show']);
全局约束:
// 文件路径:app\Providers\RouteServiceProvider.phppublic function boot(){Route::pattern('id', '[0-9]+');}
路由命名
Route::get('/users/{id}', [UserController::class, 'show'])->name('users.show');
路由分组
Route::middleware('auth')->group(function () {Route::get('/users', [UserController::class, 'index']);Route::get('/users/{id}', [UserController::class, 'show']);});
路由前缀:
Route::prefix('admin')->group(function () {Route::get('/users', [UserController::class, 'index']);});
中间件
中间件提供了一种方便的机制来检查和过滤进入应用程序的 HTTP 请求。所有中间件都位于 app/Http/Middleware 目录中。
定义中间件
要创建新的中间件,请使用 make:middleware Artisan 命令:
php artisan make:middleware EnsureTokenIsValid
注册中间件
// 文件路径:app/Http/Kernel.php/*** 全局中间件*/protected $middleware = [// \App\Http\Middleware\TrustHosts::class,\App\Http\Middleware\TrustProxies::class,\Illuminate\Http\Middleware\HandleCors::class,\App\Http\Middleware\PreventRequestsDuringMaintenance::class,\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,\App\Http\Middleware\TrimStrings::class,\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,];/*** 中间件组*/protected $middlewareGroups = ['web' => [\App\Http\Middleware\EncryptCookies::class,\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,\Illuminate\Session\Middleware\StartSession::class,\Illuminate\View\Middleware\ShareErrorsFromSession::class,\App\Http\Middleware\VerifyCsrfToken::class,\Illuminate\Routing\Middleware\SubstituteBindings::class,],'api' => [// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,'throttle:api',\Illuminate\Routing\Middleware\SubstituteBindings::class,],];/*** 路由中间件*/protected $routeMiddleware = ['auth' => \App\Http\Middleware\Authenticate::class,'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,'can' => \Illuminate\Auth\Middleware\Authorize::class,'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,];
控制器
控制器可以将相关的请求处理逻辑分组到一个类中。例如,一个 UserController 类可能会处理所有与用户相关的传入请求,包括显示、创建、更新和删除用户。默认情况下,控制器存储在 app/Http/Controllers 目录中。
编写控制器
php artisan make:controller UserController
<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;class UserController extends Controller{}
资源控制器
php artisan make:controller UserController --resource
资源控制器处理的动作:
| Verb | URI | Action | Route Name |
|---|---|---|---|
| GET | /photos |
index | photos.index |
| GET | /photos/create |
create | photos.create |
| POST | /photos |
store | photos.store |
| GET | /photos/{photo} |
show | photos.show |
| GET | /photos/{photo}/edit |
edit | photos.edit |
| PUT/PATCH | /photos/{photo} |
update | photos.update |
| DELETE | /photos/{photo} |
destroy | photos.destroy |
请求
Laravel 的 Illuminate\Http\Request 类提供了一种面向对象的方式来与您的应用程序正在处理的当前 HTTP 请求进行交互,并检索与请求一起提交的输入、cookie 和文件。
请求交互
通过依赖注入获取当前 HTTP 请求的实例。
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;class UserController extends Controller{/*** 存储一个新用户** @param \Illuminate\Http\Request $request* @return \Illuminate\Http\Response*/public function store(Request $request){$name = $request->input('name');//}}
输入
// 检索所有输入数据$input = $request->all();// 检索输入值$name = $request->input('name', 'Sally');// 检索Json输入值$name = $request->input('user.name');
文件
$file = $request->file('photo');$file = $request->photo;$path = $request->photo->store('images');$path = $request->photo->store('images', 's3');
响应
return response()->json(['name' => 'Abigail','state' => 'CA',]);
重定向:
return redirect()->route('login');
文件:
// 文件下载return response()->download($pathToFile);// 文件显示return response()->file($pathToFile);
验证
Laravel 提供了几种不同的方法来验证应用程序的传入数据。最常见的方法是对所有传入的 HTTP 请求使用 validate 方法。
php artisan make:request StorePostRequest
/*** 获取应用请求的验证规则** @return array*/public function rules(){return ['title' => 'required|unique:posts|max:255','body' => 'required',];}/*** 获取验证规则的错误消息** @return array*/public function messages(){return ['title.required' => 'A title is required','body.required' => 'A message is required',];}
/*** 存储一篇新的博客文章** @param \App\Http\Requests\StorePostRequest $request* @return Illuminate\Http\Response*/public function store(StorePostRequest $request){$validated = $request->validated();}
错误处理
app\Exceptions\Handler 类是记录应用程序抛出的所有异常然后呈现给用户。
日志记录
Laravel 日志记录基于“通道”。每个通道代表一种写入日志信息的特定方式。例如,single 通道将日志文件写入单个日志文件,而 slack 通道将日志消息发送到 Slack。日志消息可以根据其严重性写入多个通道。
配置
'stack' => ['driver' => 'stack','name' => 'channel-name','channels' => ['single', 'slack'],],
日志级别
提供 RFC 5424 规范 中定义的所有日志级别:emergency、alert、critical、error、warning、notice、info 和 debug。
Log::emergency($message);Log::alert($message);Log::critical($message);Log::error($message);Log::warning($message);Log::notice($message);Log::info($message);Log::debug($message);
继续深入
Artisan 命令行
Artisan 作为脚本存在于应用程序的根目录中,并提供了许多有用的 artisan 命令,可以在您构建应用程序时为您提供帮助。
编写命令
php artisan make:command SendEmails
<?phpnamespace App\Console\Commands;use App\Models\User;use App\Support\DripEmailer;use Illuminate\Console\Command;class SendEmails extends Command{/*** 命令的名称和签名** @var string*/protected $signature = 'mail:send {user}';/*** 命令描述** @var string*/protected $description = 'Send a marketing email to a user';/*** 执行命令** @param \App\Support\DripEmailer $drip* @return mixed*/public function handle(DripEmailer $drip){$drip->send(User::find($this->argument('user')));}}
缓存
Laravel 为各种缓存后端提供了一个富有表现力的统一 API,允许您利用它们超快的数据检索并加速您的 Web 应用程序。
配置
缓存配置文件位于 config/cache.php。在此文件中,您可以指定您希望在整个应用程序中默认使用的缓存驱动程序。
使用
<?phpnamespace App\Http\Controllers;use Illuminate\Support\Facades\Cache;class UserController extends Controller{/*** 显示所有用户列表** @return Response*/public function index(){$value = Cache::get('key');}}
// 检索Cache::get('key');Cache::get('key', 'default');// 存储Cache::put('key');Cache::put('key', 'value');// 删除Cache::forget('key');// 助手cache('key');
集合
Illuminate\Support\Collection 类为处理数据数组提供了一个流畅、方便的包装器。
$collection = collect([1, 2, 3]);
事件
Laravel 的事件提供了一个简单的观察者模式实现,允许你订阅和监听应用程序中发生的各种事件。事件类通常存储在 app/Events 目录中,而它们的侦听器存储在 app/Listeners。
文件存储
Laravel 提供了强大的文件系统抽象,得益于 Frank de Jonge 的 Flysystem 扩展包。
辅助函数
HTTP 客户端
Laravel 围绕 Guzzle HTTP 客户端 提供了一个富有表现力的最小 API ,允许您快速发出 HTTP 请求与其他 Web 应用程序通信。
扩展包开发
包是向 Laravel 添加功能的主要方式。
包发现
在 Laravel 应用程序的 config/app.php 配置文件中,providers 选项定义了 Laravel 应该加载的服务提供者列表。
"extra": {"laravel": {"providers": ["Barryvdh\\Debugbar\\ServiceProvider"],"aliases": {"Debugbar": "Barryvdh\\Debugbar\\Facade"}}},
队列
通过将时间密集型任务移到队列中,您的应用程序可以以极快的速度响应 Web 请求,并为您的客户提供更好的用户体验。
use App\Jobs\ProcessPodcast;// This job is sent to the default connection's default queue...ProcessPodcast::dispatch();// This job is sent to the default connection's "emails" queue...ProcessPodcast::dispatch()->onQueue('emails');
php artisan queue:work
创建任务
php artisan make:job ProcessPodcast
分发任务
<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use App\Jobs\ProcessPodcast;use App\Models\Podcast;use Illuminate\Http\Request;class PodcastController extends Controller{/*** Store a new podcast.** @param \Illuminate\Http\Request $request* @return \Illuminate\Http\Response*/public function store(Request $request){$podcast = Podcast::create(/* ... */);// ...ProcessPodcast::dispatch($podcast);}}
任务批处理
use App\Jobs\OptimizePodcast;use App\Jobs\ProcessPodcast;use App\Jobs\ReleasePodcast;use Illuminate\Support\Facades\Bus;Bus::chain([new ProcessPodcast,new OptimizePodcast,new ReleasePodcast,])->dispatch();
任务调度
Laravel 的命令调度器提供了一种全新的方法来管理服务器上的计划任务。
定义计划任务
您可以在 app\Console\Kernel 类的 schedule 方法中定义所有计划任务。
<?phpnamespace App\Console;use Illuminate\Console\Scheduling\Schedule;use Illuminate\Foundation\Console\Kernel as ConsoleKernel;use Illuminate\Support\Facades\DB;class Kernel extends ConsoleKernel{/*** Define the application's command schedule.** @param \Illuminate\Console\Scheduling\Schedule $schedule* @return void*/protected function schedule(Schedule $schedule){$schedule->call(function () {DB::table('recent_users')->delete();})->daily();}}
安全
验证
授权
加密
通过 OpenSSL 使用 AES-256 和 AES-128 来加密和解密文本。
哈希
提供了安全的 Bcrypt 和 Argon2 哈希来存储用户密码。
重置密码
数据库
入门
读写分离
'mysql' => ['read' => ['host' => ['192.168.1.1','196.168.1.2',],],'write' => ['host' => ['196.168.1.3',],],'sticky' => true,'driver' => 'mysql','database' => 'database','username' => 'root','password' => '','charset' => 'utf8mb4','collation' => 'utf8mb4_unicode_ci','prefix' => '',],
分页
迁移
数据库的版本控制。
生成迁移
php artisan make:migration create_flights_table
迁移结构
一个迁移类包含两个方法:up 和 down。up 方法用于向数据库添加新表、列或索引,而 down 方法用于撤销 up 方法执行的操作。
<?phpuse Illuminate\Database\Migrations\Migration;use Illuminate\Database\Schema\Blueprint;use Illuminate\Support\Facades\Schema;return new class extends Migration{/*** Run the migrations.** @return void*/public function up(){Schema::create('flights', function (Blueprint $table) {$table->id();$table->string('name');$table->string('airline');$table->timestamps();});}/*** Reverse the migrations.** @return void*/public function down(){Schema::drop('flights');}};
运行迁移
php artisan migrate
回滚迁移
php artisan migrate:rollback
数据填充
Redis
Eloquent ORM
入门
这是一个对象关系映射器 (ORM),使用 Eloquent 时,每个数据库表都有一个对应的“模型”,用于与该表进行交互。
生成模型类
php artisan make:model Flight
