Поэтому я разрабатываю фреймворк и до сих пор использую контейнер, который может вызываться статически в приложении:
$router = new Router;
Container::set('router', $router); // this can now be called anywhere
Это тогда в любом другом файле в приложении, можно назвать так:
$router = Container::get('router'); // get the router object with all current data
$router->add_route('/blog', '/Path/To/Controller/Blog@index');
Внутри контроллера я бы тогда имел:
class Blog_Controller extends Base_Controller
{
public function __construct()
{
$this->blog_model = Container::get('Blog_Model'); // this is instantiated OR if it has already, the container returns the existing object INCLUDING all of its properties thus far.
}
public function view($id)
{
$this->blog_model->get_post($id);
}
}
Тем не менее, я прочитал о том, как создавать DI-контейнеры, которые внедряют зависимости при вызове контроллера, как в примере ниже:
class Blog_Controller extends Base_Controller
{
public function __construct(Blog_Model $blog_model)
{
$this->blog_model = $blog_model; // this is instantiated OR if it has already, the container returns the existing object INCLUDING all of its properties thus far.
}
public function view($id)
{
$this->blog_model->get_post($id);
}
}
У меня проблемы с выяснением, как эффективно это сделать.
Как бы я мог создать экземпляр Blog_Model (или вернуть, если он уже был) без необходимости делать это вручную new Blog_Model
,
Задача ещё не решена.
Других решений пока нет …