Contrôleurs
Une fois les routes créées, on peut donc utiliser les contrôleurs pour faire le lien avec les vues du projet.
Chaque contrôleur utilise un namespace qui correspond à un emplacement dans le système de fichiers. Cela va lui permettre de savoir de connaître les noms des routes de son dossier, et ainsi d'y faire référence. Par exemple, les contrôleurs présents dans le dossier modules/Admin vont indiquer être dans ce namespace, et pourront ainsi faire références aux routes de ce dossier.
Cela permet de bien diviser le projet, pour éviter des manipulations entre des contrôleurs qui ne sont pas censés communiquer, et pouvoir ainsi augmenter la sécurité.
Les contrôleur sont des classes héritants d'un contrôleur nommé BaseController, héritant lui-même d'un contrôleur nommé Controller, qui lui provient directement de CodeIgniter. BaseController est une classe abstraite, qui va permettre de charger des éléments si besoin et ainsi d'améliorer les performances. Son utilisation est détaillé dans la documentation de CodeIgniter mais elle n'a pas beaucoup utilisée par Castopod.
Si on reprend l'exemple de la page d'accueil, nous avons donc besoin d'afficher une page avec la liste des podcasts disponibles, qui sont triés suivant un certain ordre.
Pour cela, on va avoir besoin de savoir quelles sont les podcasts inscrits dans la base de données, et donc utilisés le modèle associé. Pour les podcasts, le modèle est PodcastModel, et pour savoir comment les triés, un simple paramètre dans la requête permettra de savoir comment l'utilisateur veut trier les podcasts.
Pour rappel, la route était :
$routes->get('/', 'HomeController', [
'as' => 'home',
]);
Il n'y a pas de fonction particulière du contrôleur qui a été appelé. Pour définir la fonction par défaut du contrôleur, il suffit de déclarer une fonction nommée index().
Ensuite, pour la signature de la fonction, on a plusieurs solutions, qui sont généralement :
- Un objet string avec la fonction view(), qui attendra le nom d'une vue
- Un objet RedirectResponse, avec la fonction redirect()->route(), qui attendra lui le nom d'une route
Les objets qui peuvent être renvoyés proviennent du dossier CodeIgniter\HTTP, et peuvent être importés à l'aide du mot-clé use.
Ici, le contrôleur renvoie deux types différents en fonction de la réponse du modèle de podcast, si un seul podcast est récupéré alors on chargera directement la page du podcast, sinon on affichera la vue nommée home :
class HomeController extends BaseController
{
public function index(): RedirectResponse | string
{
// Paramètres possibles du GET
$sortOptions = ['activity', 'created_desc', 'created_asc'];
// Récupérer le paramètre, ou mettre par activité récente le tri
$sortBy = in_array($this->request->getGet('sort'), $sortOptions, true) ? $this->request->getGet(
'sort'
) : 'activity';
// Récupérer les podcasts
$allPodcasts = (new PodcastModel())->getAllPodcasts($sortBy);
// Regarder s'il n'y a qu'un podcast, et dans ce cas renvoyé sur la page
// du podcast directement
if (count($allPodcasts) === 1) {
return redirect()->route('podcast-activity', [$allPodcasts[0]->handle]);
}
// Création d'un objet data, qui va contenir les podcasts récupérés
$data = [
'podcasts' => $allPodcasts,
'sortBy' => $sortBy,
];
// Charger la vue avec l'objet data
return view('home', $data);
}
}
Vous remarquerez qu'un objet data a été créé avec deux paramètres, podcasts qui contient la liste des podcasts récupérés et sortBy qui contient la manière dont les podcasts sont triés.
Dans la vue home, on pourra directement utilisés ces valeurs en faisant référence aux paramètres. Pour cela, on pourra directement utiliser les variables podcasts et sortBy dans la vue.