laravel11简化了应用程序结构,就是说,新建的应用如果直接旧版的习惯去搞,额。。。
如果仔细阅读过上面这句,你会发现,我的意思其实是:不是不行。
laravel11大部分操作都移到了bootstrap/app.php中,
所以咱撸的时候,不管啥玩意都首先考虑往这里面塞:中间件、路由、异常处理、调度。。。。
么一,眼花缭乱。。。。
咱这菜鸡不懂这设计是咋想的,但撸到最后一定是好几十兆的超大号.php
最后还是得拆开。
办法很简单,方法也很多,就是先这样在那样然后就可以了:
确认一下定时任务内容
php artisan schedule:list
比如我这里用单例绑定:
用command创建一个Kernel类:
php artisan make:class App/Console/Kernel
make:class 属于laravel11新增的一个make方法
然后,这个类继承Illuminate\Foundation\Console\Kernel
并且实现一个接收'Illuminate\Console\Scheduling\Schedule'的schedule()方法
修改后的代码如下
//app/Console/Kernel.php
<?php
namespace App\Console;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Console\Scheduling\Schedule;
class Kernel extends ConsoleKernel
{
protected function schedule(Schedule $schedule): void
{
//写一个不知道这是干啥的任务进去,让它几秒钟跑一次,并且它能在schedule:run在无任务时避免supervisor异常退出
//所以我就留着它了,你也可以用其它空命令代替
//或者其它之前没有的命令
$schedule->command('inspire')->everySecond();
}
}
然后绑定到应用里面:
修改那个即将变成超大号.php的文件
在里面随便找个位置添加一个withSingletons()
//bootstrap/app.php
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
//在这里添加一个withSingletons方法,这个方法接收一个数组参数,这个数组的键是单例的类名,值是单例的实例
->withSingletons([
//将刚才创建的Kernel 类注册进来
Illuminate\Contracts\Console\Kernel::class=>App\Console\Kernel::class
])
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
测试下效果
# 查看调度列表
php artisan schedule:list
php artisan schedule:work
新work的起床气有点重,你得等等,最多一分钟,你就能看到上图这样的内容了