如何为Laravel Jobs强制启用严格类型校验?
Laravel Jobs 中启用严格类型校验的问题与解决
问题原因
PHP 的 declare(strict_types=1) 是文件级别的配置,仅对当前文件内发起的函数/方法调用生效。当你使用 TestJob::dispatch(true) 时,Laravel 框架内部的代码(未开启严格类型校验)会负责实例化你的 Job 类,此时调用构造函数处于弱类型模式,会自动将 bool 类型的 true 转换为 int 类型的 1,不会触发类型错误。而普通类的实例化是在你自己开启了严格类型的代码文件中进行的,因此能正常触发校验。
解决方案
方案1:手动实例化 Job 再调度
在你自己的业务代码文件(需开启 strict_types=1)中,先手动创建 Job 实例,再执行调度。此时构造函数的调用发生在严格类型模式下,会直接触发类型校验:
<?php declare(strict_types=1); use App\Jobs\Test\TestJob; // 传入true会立即抛出TypeError dispatch(new TestJob(true));
方案2:为 Job 添加严格调度方法
在 Job 类中自定义一个静态调度方法,在方法内部直接实例化 Job(调用逻辑处于开启了严格类型的 Job 文件中):
<?php declare(strict_types=1); namespace App\Jobs\Test; use Illuminate\Foundation\Bus\Dispatchable; class TestJob { use Dispatchable; public function __construct(private readonly int $number1) { var_dump($number1); die(); } public function handle(): void { } // 自定义严格调度方法 public static function dispatchStrict(int $number1) { return self::dispatch(new self($number1)); } }
调用时使用该自定义方法即可触发严格校验:
TestJob::dispatchStrict(true); // 抛出TypeError
方案3:构造函数内手动校验类型
如果需要在任何场景下强制校验类型,可以在构造函数中手动检查参数的原始类型(针对弱类型转换的场景做特殊判断):
public function __construct(private readonly int $number1) { // 阻止布尔值被转换为整数 $originalArg = func_get_arg(0); if (is_bool($originalArg)) { throw new TypeError('参数number1不能为布尔类型'); } var_dump($number1); die(); }
内容的提问来源于stack exchange,提问作者thiago tanaka
相关产品推荐
相关产品推荐

