Я пришел с решением, описанным в документации Phalcon, но с некоторыми изменениями, чтобы соответствовать моим потребностям.
Решение, с которым я пришел, заключается в добавлении нового слушателя диспетчерских событий в контейнер обслуживания для обработки зависимостей действий, пример:
$di->setShared('dispatcher', function() {
$evManager->attach("dispatch:beforeDispatch", function (Event $event, Dispatcher $dispatcher) {
try {
$methodReflection = new ReflectionMethod(
$dispatcher->getControllerClass(),
$dispatcher->getActiveMethod()
);
foreach ($methodReflection->getParameters() as $parameter) {
$parameterClass = $parameter->getClass();
if ($parameterClass instanceof ReflectionClass) {
$dispatcher->setParam($parameter->name, new $parameterClass->name);
}
}
} catch (Exception $exception) {
throw new \Exception('', Dispatcher::EXCEPTION_HANDLER_NOT_FOUND);
}
});
$dispatcher = new Dispatcher();
$dispatcher->setEventsManager($evManager);
return $dispatcher;
}
Каждый фреймворк имеет свой собственный механизм, поэтому, если вам нужно сделать что-то особенное, вы должны сделать это вручную.