Внедрение зависимостей в InlineAction
Добавлено: 2019.12.08, 19:13
Собственно вопрос в том, почему это не реализовано. Рефлексия там уже есть, затрат почти никаких, добавить десяток строк.
Тесты не писал, но вроде все работает так.
Тесты не писал, но вроде все работает так.
Код: Выделить всё
public function bindActionParams($action, $params)
{
if ($action instanceof InlineAction) {
$method = new \ReflectionMethod($this, $action->actionMethod);
} else {
$method = new \ReflectionMethod($action, 'run');
}
$args = [];
$missing = [];
$actionParams = [];
foreach ($method->getParameters() as $param) {
$name = $param->getName();
$class = $param->getClass();
if (array_key_exists($name, $params) && $class === null) {
if ($param->isArray()) {
$args[] = $actionParams[$name] = (array) $params[$name];
} elseif (!is_array($params[$name])) {
$args[] = $actionParams[$name] = $params[$name];
} else {
throw new BadRequestHttpException(Yii::t('yii', 'Invalid data received for parameter "{param}".', [
'param' => $name,
]));
}
unset($params[$name]);
} elseif ($param->isDefaultValueAvailable()) {
$args[] = $actionParams[$name] = $param->getDefaultValue();
} else {
if ($class !== null) {
$className = $class->getName();
try {
$args[] = Yii::$container->get($className);
} catch (NotInstantiableException $e) {
$missing[] = $name;
}
} else {
$missing[] = $name;
}
}
}
if (!empty($missing)) {
throw new BadRequestHttpException(Yii::t('yii', 'Missing required parameters: {params}', [
'params' => implode(', ', $missing),
]));
}
$this->actionParams = $actionParams;
return $args;
}