Bonsoir,
J'ai suivi en grande partie la formation sur la POO faite par Grafikart. En suivant le chapitre interface, on parle de la classe Session et Cookie, nous permettant de mettre en place un système de flash.
Seulement, je n'arrive pas à l'implémenter sur le petit framework qu'on a créé en suivant les TP. Personnellement, après le chapitre MVC, j'ai cette arboresence (seul le dossier Component dans Core est du perso).
Pour afficher un message flash, je le met dans app/Views/templates/default.php (j'ai enlevé toute la partie html, ce n'est pas le plus important) :
<?= $flash->get(); ?>
<?= $content; ?>
La question est où mettre :
<?php
$session = new Core\Component\Session();
$flash = new Core\Component\Flash($session);
Dans core/Controller/Controller.php ? Dans la méthode render() ? Car c'est ce que j'ai fait actuellement :
<?php
public function render($view, $variables = []){
ob_start();
$session = new Session();
$flash = new Flash($session);
extract($variables);
require $this->viewPath . str_replace('.', '/', $view) . '.php';
$content = ob_get_clean();
require $this->viewPath . 'templates/' . $this->template . '.php';
}
Dans le obstart() afin que $session et $flash soient accessibles dans le template. Saut qu'il faudrait qu'ils soient aussi accessible dans les méthodes des autres controller, comme PostsController.php.
Même pour pouvoir utiliser les sessions ou les cookies, quel serait le meilleur endroit ? J'ai encore un peu de mal à bien comprendre comment placer une instanciation pour pouvoir utiliser globalement l'objet (les termes sont bons ?). Merci d'avance.
Alors pour ça en général, on utilise l'injection de dépendance (il y a un tuto dessus dans la formation POO)
Mais si tu ne veux pas aller jusque là, tu peux les déclarer dans ton index (enfin, la page sur laquelle tout est redirigé) et ensuite les mettres globales. Mais je déconseille
Non, pas de variable globale, je souhaite vraiment utiliser et comprendre les notions de la POO.
Il y a déjà une injection de dépendance de Session dans Flash :
<?php
namespace Core\Component;
class Flash
{
private $session;
// elle est ici l'injection de dépendance si je ne dis pas de bétise
function __construct(Session $session){
$this->session = $session;
}
...
}
Donc si je souhaite faire la même pour les Sessions, Cookies et Flash, faut-il le faire dans App.php ? Je ne vois pas vraiment où faire cet DI, dans quel bon fichier.
EDIT : faire ceci dans AppController.php ?
<?php
namespace App\Controller;
use \App;
use Core\Controller\Controller;
class AppController extends Controller
{
protected $template = 'default';
protected $session;
protected $flash;
public function __construct(){
$this->viewPath = ROOT . '/app/Views/';
$this->session = new Session();
$this->flash = new Flash($this->session);
}
protected function loadModel($model_name){
$this->$model_name = App::getInstance()->getTable($model_name);
}
}
?>
Le problème est qu'à chaque appelle d'une page (donc un controller qui hérite forcément de AppController), on recrée session et flash, ce n'est pas bon. Il faudrait qu'une seule et unique instanciation par utilisateur mais que session, cookie et flash soit accessible dans le template, dans les différents controllers. Je sèche..
Alors pour ça, vois du côté du conteneur d'injection de dépendance, voire du pattern singleton, si besoin. Mais il me semble que le DIC suffit ;)