L'injection de dépendance dans les classes de base et dérivés
-
27-10-2019 - |
Question
J'ai une base abstraite classe contrôleur et tous les contrôleurs d'action sont dérivés.
classe contrôleur de base à la construction Voir objet initialise. Cet objet View est utilisé par tous les contrôleurs d'action. Chaque contrôleur d'action ont différentes dépendances (ceci est résolu à l'aide de conteneur de DI).
Le problème est que la classe de base Controller a besoin aussi des dépendances (ou paramètres), par exemple, le chemin pour afficher le dossier. Et la question est - où et comment passer des paramètres à la base de classe Controller
$dic = new Dic();
// Register core objects: request, response, config, db, ...
class View
{
// Getters and setters
// Render method
}
abstract class Controller
{
private $view;
public function __construct()
{
$this->view = new View;
// FIXME: How / from where to get view path?
// $this->view->setPath();
}
public function getView()
{
return $this->view;
}
}
class Foo_Controller extends Controller
{
private $db;
public function __construct(Db $db)
{
$this->db = $db;
}
public function barAction()
{
$this->getView()->some_var = 'test';
}
}
require_once 'controllers/Foo_Controller.php';
// Creates object with dependencies which are required in __construct()
$ctrl = $dic->create('Foo_Controller');
$ctrl->barAction();
La solution
Ceci est juste un exemple de base. Pourquoi le $ VERNISSAGE? Y at-il une bonne raison?
class View {
protected $path;
protected $data = array();
function setPath($path = 'standard path') {
$this->path = $path;
}
function __set($key, $value) {
$this->data[$key] = $value;
}
function __get($key) {
if(array_key_exists($key, $this->data)) {
return $this->data[$key];
}
}
}
abstract class Controller {
private $view;
public function __construct($path)
{
$this->view = new View;
$this->view->setPath($path);
}
public function getView()
{
return $this->view;
}
}
class Foo_Controller extends Controller {
private $db;
public function __construct(Db $db, $path)
{
// call the parent constructor.
parent::__construct($path);
$this->db = $db;
}
public function barAction()
{
$this->getView()->some_var = 'test';
}
public function getAction() {
return $this->getView()->some_var;
}
}
class DB {
}
$con = new DB;
$ctrl = new Foo_Controller($con, 'main');
$ctrl->barAction();
print $ctrl->getAction();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow