Php 无法在laravel配置文件中写入函数

Php 无法在laravel配置文件中写入函数,php,laravel,function,Php,Laravel,Function,我有一个数据集,为这些字段设置了一个配置文件,并将每个字段所需的更改设置为函数 'email' => [ 'column' => 'B', 'change' => null, 'field' => 'users.email', ], 'license_type' => [ 'column' => 'C', 'field' => 'users.is_role', 'change' =>

我有一个数据集,为这些字段设置了一个配置文件,并将每个字段所需的更改设置为函数

'email'        => [
    'column' => 'B',
    'change' => null,
    'field'  => 'users.email',
],
'license_type' => [
    'column' => 'C',
    'field'  => 'users.is_role',
    'change' => function ($value) {
        $roles = ["Licensed Teacher", "Licensed Coach", "Teacher's Trainer"];
        return $roles[$value];
    },
],
'date'         => [
    'column' => 'K',
    'field'  => 'webhook.start_date',
    'change' => function ($value) {
        return Carbon\Carbon::createFromTimestamp($value)->toDateString();
    },
],
因此,为了得到一个字段的最终值,我将其适当的更改函数应用于该值

所有这些都可以正常工作,但当在配置中定义函数时,laravel会抛出一个错误

PHP致命错误:调用第159行/var/www/html/bootstrap/cache/config.PHP中未定义的方法闭包::u set_state()


如何修复此错误?

您可以重构函数,使其作为嵌套数组,可以使用标准的
config()
方法引用。然后,当您需要一个特定的
更改
值时,可以调用
config('license\u type.change.0')
来获取
“持牌教师”
,其中
0
“持牌教师”
等的密钥

'email'        => [
    'column' => 'B',
    'change' => null,
    'field'  => 'users.email',
],
'license_type' => [
    'column' => 'C',
    'field'  => 'users.is_role',
    'change' => [
        "Licensed Teacher",
        "Licensed Coach", 
        "Teacher's Trainer"
    ],
],

您可以调整
change
字段的内容,使其仅包含数组。然后,使用该值的实现应该执行从值到numberfml的映射。这只是变化函数的一个例子。它可以是任何东西。我更新了这个问题,请检查这仅仅是因为Laravel试图在缓存配置时序列化闭包,而PHP不允许。可以使用各种库,但最好将函数添加到管理每种类型更改的类中,然后在配置中引用该类。@benJ是的,谢谢。结果就是这样FML。这只是变化函数的一个例子。它可以是任何东西。我已经更新了这个问题,请检查好吧,很抱歉误解了,配置文件不应该用来存储函数,而应该是普通字符串或常量。它滥用文件将函数存储为值。有关更多信息,请参阅本期。这是一篇老文章,但仍然相关。我不知道您希望在哪里调用函数,但它们看起来更适合作为引用配置文件中存储的字符串值的模型方法。e、 g.您可以使用
用户
模型来存储返回这些值的
许可证类型_change
方法。将change函数移动到模型听起来很糟糕,因为这样相关的逻辑将分布在不同的位置。你知道,我在lumen中实现了它,就像这样,但它没有给出任何问题。是的。我不喜欢相关代码位于不同的位置,这会使项目更加混乱。如果我必须按照你的方式来做,我认为最好只编写一个更改方法,根据每个字段进行清理。好的,我已经找到了你问题的解决方案,但是作为记录,我认为你可以重构你的逻辑,在配置文件之外工作。您可以像这样成功引用您创建的
change
函数:
config('app.license\u types.change')('1')
,其中
config('app.license\u types.change')
返回更改函数,
('1')
定义您作为
$value
参数传入
'1'
。我已经在Laravel 6上测试过了,它可以正常工作。如果这不起作用,请尝试在命令行中使用
php-artisan-config:clear
清除配置缓存