Laravel8 Jetstream Inertia API令牌页DateTime解析错误如何处理?
报错原因
该问题由PostgreSQL timestamp类型字段返回格式与Laravel Jetstream默认的Carbon日期解析规则不匹配导致:
- Jetstream存储API Token的
expires_at、created_at等字段为timestamp类型,PostgreSQL读取该类型字段时,默认返回EEE dd MMM HH:mm:ss yyyy格式的字符串(即报错中的Thu 24 Jun 16:46:15 2021格式) - Laravel默认的日期解析规则未兼容该格式,Carbon尝试解析时就会抛出格式不匹配异常。
修复方法
任选以下一种方案即可:
方案1:自定义Sanctum Token模型的日期格式(推荐)
- 复制
vendor/laravel/sanctum/src/PersonalAccessToken.php文件到app/Models/PersonalAccessToken.php路径 - 在
app/Providers/AuthServiceProvider.php中注册自定义的Token模型:
use App\Models\PersonalAccessToken; use Laravel\Sanctum\Sanctum; public function boot() { $this->registerPolicies(); Sanctum::usePersonalAccessTokenModel(PersonalAccessToken::class); }
- 在自定义的
PersonalAccessToken.php模型中添加兼容PostgreSQL日期格式的配置:
protected $dateFormat = 'D d M H:i:s Y';
方案2:修改PostgreSQL连接的日期输出格式
在config/database.php的pgsql连接配置中添加初始化语句,修改当前会话的日期输出规则:
'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', 'sslmode' => 'prefer', // 新增下面的options配置 'options' => [ PDO::ATTR_EMULATE_PREPARES => true, PDO::PGSQL_ATTR_INIT_COMMAND => 'SET datestyle = "ISO, YMD"' ], ],
修改完成后执行php artisan config:clear清除配置缓存即可生效。
内容的提问来源于stack exchange,提问作者Diego Rodrigo
相关产品推荐
相关产品推荐

