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();
Était-ce utile?

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
scroll top