Вот есть у меня скрипт инициализации MVC - он создаёт и запускает FrontController:
$request = new Request;
$root = $request->getRoot();
$settings = new Settings($root . DIRECTORY_SEPARATOR . 'settings' . DIRECTORY_SEPARATOR. 'global.php');
$logger = new Logger($root . $settings->logs_dir);
// Loading advanced exception and error handlers
$p_handler = new ProblemHandler($settings->dev_mode, $logger);
$p_handler->setHandlers();
// Pre-configuring PHP and environment
$starter = new Starter;
$starter->prepare();
$front_controller = new FrontController($request, $settings, new Router, $logger);
$front_controller->route();
$front_controller->invoke();
Как видно, здесь я создаю необходимые FrontController'у объекты прямо в клиентском коде. Далее, в конструкторе, я прописываю их в свойства:
class FrontController
{
private $request;
private $settings;
private $router;
private $logger;
private $controller;
private $action;
private $params = [];
public function __construct(Request $request, Settings $settings, Router $router, Logger $logger)
{
$this->request = $request;
$this->settings = $settings;
$this->router = $router;
$this->logger = $logger;
}
И вот обратите внимание на new Router - он создаётся при создании FrontController, и более нигде в клиентском коде не используется. Как лучше: создавать его как в примере, или лучше убрать из аргументов и создавать в конструкторе:
public function __construct(Request $request, Settings $settings, Logger $logger)
{
$this->request = $request;
$this->settings = $settings;
$this->logger = $logger;
$this->router = new Router;
}
Никак не пойму, по какому принципу делается выбор между двумя этими вариантами...