拉拉维尔:PHP 工匠优化命令返回错误'not serializable'



laravel 6

当我运行时:php artisan optimize

我得到了这个错误:

您的配置文件不可序列化。

我检查了一下,发现了目标文件:

config\lastable.php中的错误因为这部分代码:

'method' => function($string, $separator = '-') {
$_transliteration = ["/ö|œ/" => "e",
"/ü/" => "e",
"/Ä/" => "e",
"/Ü/" => "e",
"/Œ/" => "E",
"/ƒ/" => ""];
$quotedReplacement = preg_quote($separator, '/');
$merge = [
'/[^sp{Zs}p{Ll}p{Lm}p{Lo}p{Lt}p{Lu}p{Nd}]/mu' => ' ',
'/[sp{Zs}]+/mu' => $separator,
sprintf('/^[%s]+|[%s]+$/', $quotedReplacement, $quotedReplacement) => '',
];
$map = $_transliteration + $merge;
unset($_transliteration);
return preg_replace(array_keys($map), array_values($map), $string);
},

我知道在Laravel中不允许闭包序列化。但是,我如何使用slackable.php中的传统函数重写这段代码呢?

这不是Laravel的限制,而是Php的限制。的一种变通方法,但这在某种程度上取决于使用该"方法"值的功能是检查Closure的类型提示,还是内容只需要是callable

创建一个新的Class,并对其应用Magic__invoke()方法。在该方法中,执行该闭包并返回结果。并将您的配置设置为引用该类的实例。这里的诀窍是序列化现在可以引用对象而不是函数,只要该函数没有应用于该类中的属性,它就应该起作用,因为序列化不会折叠方法。__invoke()方法允许任何下游行为与对象通信,就好像它是一个函数一样。

不过,我还是建议,试着找到一条完全不需要关闭的不同途径。如果有这个选项,它会更干净。

最新更新