Переменные свойства в методе переменных

Я использую сторонний пакет, который манипулирует изображениями. Для базовых преобразований допускается одно значение:

$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);
}
}

Это отлично работает за НЕ ЗАМУЖЕМ ценности.

Однако в пакете есть методы, которые принимают несколько свойств по отношению к методу, например:

$image = $this->addMediaConversion('thumb');
$image->fit(Manipulations::FIT_FILL, 560, 560);

Существуют различные доступные методы, которые имеют различные допустимые атрибуты. Я ищу * ELEGANT * Решение этого. Я могу достичь этого, имея массив значений в моем конфигурационном файле, проверяя тип, проверяя длину этого массива, а затем передавая правильное число, но это не масштабируемое, легко поддерживаемое и не элегантное.

Config:

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);
}
}
}

Какое самое лучшее и элегантное решение для этого?

3

Решение

Вы должны использовать 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);
}
}
}
2

Другие решения

проверять, выписываться call_user_func_array ()

0

По вопросам рекламы [email protected]