У меня это решение с инжектором конструктора из внутреннего контейнера Slim
В основном основная магия скрыта в __call
функции
class App extends Slim
public function __call($name, $params) {
return function () use ($name, $params) {
list($class, $action) = explode('_', $name . '_handle'); // default method is handle
$args = [];
$class = new \ReflectionClass($class);
$constructor = $class->getConstructor();
foreach ($constructor->getParameters() as $param) {
$args[] = ($param->name === 'app') ? $this : $this->container->get($param->name);
}
$controller = $class->newInstanceArgs($args);
return call_user_func([$controller, $action], func_get_args() + $params);
};
}
}
контроллер должен иметь приложение в параметрах конструктора:
class Homepage {
public $app;
public function __construct(\App $app) {
$this->app = $app;
}
}
И у index.php есть только настройки маршрутизатора
$app = new \App();
$app->get('/', $app->Homepage());
$app->run(
Посмотреть весь код здесь https://gist.github.com/OzzyCzech/7230064