提问人:Mike 提问时间:2/27/2018 最后编辑:apokryfosMike 更新时间:9/16/2021 访问量:42
变量方法的变量属性
Variable properties on a variable method
问:
我正在使用处理图像的第三方软件包。对于基本转换,它接受单个值:
$image = $this->addMediaConversion('thumb');
$image->width(100);
$image->height(100);
我正在构建的系统具有抽象级别,我需要从配置文件中定义这些值。我将配置文件作为数组加载。然后,我可以遍历配置文件中的值并生成各种转换。
我的配置文件:
return [
'thumb' => [
'width' => 100,
'height' => 100,
],
];
从该配置定义这些转换的代码:
$definitions = config('definitions');
foreach($definitions as $name => $keys) {
$image = $this->addMediaConversion($name);
foreach($keys as $key => $value) {
$image->$key($value);
}
}
这适用于 SINGLE 值。
但是,该包包含针对某个方法采用多个属性的方法,例如:
$image = $this->addMediaConversion('thumb');
$image->fit(Manipulations::FIT_FILL, 560, 560);
有各种方法可用,它们具有各种不同的可接受属性。我正在寻找一个*优雅*的解决方案。我可以通过在我的配置文件中有一个值数组,检查类型,检查该数组的长度,然后传递正确的数字来实现它,但这不是可扩展的,易于维护的,也不优雅。
配置:
return [
'thumb' => [
'fit' => [Manipulations::FIT_FILL, 560, 560]
]
];
法典:
foreach($image_definitions as $name => $keys) {
// Generate the conversion
$conversion = $this->addMediaConversion($name);
// Loop through and define the attributes as they are in the config, things like ->width(), ->height()
foreach($keys as $key => $value) {
if(is_array($value))
{
// LOOKING FOR A MORE ELEGANT WAY TO DO THE BELOW
switch(count($value))
{
case 2:
$conversion->$key($value[0], $value[1]);
break;
case 3:
$conversion->$key($value[0], $value[1], $value[2]);
break;
case 4:
$conversion->$key($value[0], $value[1], $value[2], $value[3]);
break;
case 5:
$conversion->$key($value[0], $value[1], $value[2], $value[3], $value[4]);
break;
case 6:
$conversion->$key($value[0], $value[1], $value[2], $value[3], $value[4], $value[5]);
break;
}
} else
{
$conversion->$key($value);
}
}
}
对此,最好和最优雅的解决方案是什么?
答:
0赞
Dormilich
2/27/2018
#1
2赞
Roland D.
2/27/2018
#2
您必须使用call_user_func_array,如下所示:
foreach($image_definitions as $name => $keys) {
// Generate the conversion
$conversion = $this->addMediaConversion($name);
// Loop through and define the attributes as they are in the config, things like ->width(), ->height()
foreach ($keys as $key => $value) {
if (is_array($value)){
call_user_func_array(array($conversion, $key), $value);
} else {
$conversion->$key($value);
}
}
}
评论
0赞
Mike
2/27/2018
谢谢。对谷歌来说是一个困难的问题。
评论