IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Tutoriel pour apprendre à utiliser le framework Laravel 4


précédentsommairesuivant

IX. Chapitre 9 : Les contrôleurs

Nous avons vu que nous pouvons nous contenter de routes et de vues pour créer un site. C'est parfait tant qu'on doit faire des choses simples, mais avec une application un peu lourde on peut se retrouver avec beaucoup de code dans le fichier des routes, ce qui n'est pas très judicieux. Une autre option consiste à créer des contrôleurs (schéma MVC). Cette solution permet aussi l'injection automatique de dépendances comme nous le verrons plus tard.

IX-A. Créer un contrôleur

Si vous regardez dans le dossier app/controllers, vous trouvez le fichier HomeController.php :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class HomeController extends BaseController {
/*
|--------------------------------------------------------------------------
| Default Home Controller
|--------------------------------------------------------------------------
|
| You may wish to use controllers instead of, or in addition to, Closure
| based routes. That's great! Here is an example controller method to
| get you started. To route to this controller, just add the route:
|
|    Route::get('/', 'HomeController@showWelcome');
|
*/
 
public function showWelcome()
{
    return View::make('hello');
}
 
}

On vous explique que c'est un exemple pour réaliser vos propres contrôleurs. La syntaxe est simple : on crée une classe qui hérite de BaseController. Notez que le nom de la classe, conformément au PSR-1 adopte le principe du StudlyCaps, c'est-à-dire que chaque mot commence par une majuscule, y compris le premier (contrairement au camelCase). Le fichier de cette classe se trouve dans le même dossier app/controllers/BaseController.php :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class BaseController extends Controller {
 
    /**
     * Setup the layout used by the controller.
     *
     * @return void
     */
    protected function setupLayout()
    {
        if ( ! is_null($this->layout))
        {
            $this->layout = View::make($this->layout);
        }
    }
 
}

Cette classe hérite de la classe Controller qui est la classe générique de Laravel pour les contrôleurs. Vous pouvez donc placer ici du code qui concerne tous vos contrôleurs. Il y a d'ailleurs déjà une méthode pour générer un template. Nous allons pour le moment laisser de côté la classe BaseController et voir comment on active un contrôleur avec une route. Puisqu'on a déjà un contrôleur, on va l'utiliser. En plus on nous explique gentiment dans le commentaire comment on doit faire Image non disponible. Entrez donc ce code dans le fichier des routes :

 
Sélectionnez
Route::get('/', 'HomeController@showWelcome');

Si vous n'avez pas supprimé le fichier app/views/hello.php vous devez obtenir cet affichage :

Image non disponible

Si vous l'avez supprimé il suffit de le recréer avec ce code :

 
Sélectionnez
<h1>Hello World!</h1>

Avec ce que nous avons vu jusqu'à présent, l'utilisation de contrôleur n'apporte pas grand-chose si ce n'est d'organiser le code différemment. Au lieu de le mettre directement dans la route on le déporte dans le contrôleur. Tout cela prendra son sens avec des fonctionnalités plus avancées que nous verrons ultérieurement.

IX-A-1. Un contrôleur « RESTful »

Vous pouvez avec Laravel créer un contrôleur qui répond aux conventions de nommage de la norme REST. Voyons un exemple simple de contrôleur :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class GuestController extends BaseController {
 
    /**
    * Affiche le formulaire de login
    *
    * @return View
    */
    public function getLogin()
    {
            //  ...
    }
 
    /**
    * Traitement du formulaire de login
    *
    * @return Redirect
    */
    public function postLogin()
    {
             //  ...    
    }
}

On a deux actions login (identifiant), une avec la méthode GET et l'autre la méthode POST. Au niveau des routes on se contente de cette ligne de code :

 
Sélectionnez
Route::controller('guest', 'GuestController');

Avec l'URL http://localhost/blog/public/guest/login on active l'action login qui correspond à la méthode getLogin. Avec le même URL mais la méthode POST on active l'action login qui correspond à la méthode postLogin. Il suffit donc de bien préfixer les actions avec get et post. Je montrerai un exemple complet d'application ultérieurement.

IX-A-2. Créer un contrôleur de ressource avec artisan

Laravel possède un outil en ligne nommé Artisan. Il permet de faire bien des choses. Pour vous en rendre compte, entrez php artisan en ligne de commande :

Image non disponible

Vous pouvez voir qu'il y a pas mal de commandes disponibles. Nous allons nous intéresser pour le moment à la commande controller:make qui sert justement à créer un contrôleur. Voyons les options de cette commande :

Image non disponible

Nous allons commencer par une création simple :

Image non disponible

On nous dit que le contrôleur a été créé, nous le trouvons effectivement dans app/controllers/mon_controleur.php :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
<?php

class mon_controleur extends BaseController {

    /**
    * Display a listing of the resource.
    *
    * @return Response
    */
    public function index()
    {
    //
    }

    /**
    * Show the form for creating a new resource.
    *
    * @return Response
    */
    public function create()
    {
    //
    }

    /**
    * Store a newly created resource in storage.
    *
    * @return Response
    */
    public function store()
    {
    //
    }

    /**
    * Display the specified resource.
    *
    * @return Response
    */
    public function show($id)
    {
    //
    }

    /**
    * Show the form for editing the specified resource.
    *
    * @return Response
    */
    public function edit($id)
    {
    //
    }

    /**
    * Update the specified resource in storage.
    *
    * @return Response
    */
    public function update($id)
    {
    //
    }

    /**
    * Remove the specified resource from storage.
    *
    * @return Response
    */
    public function destroy($id)
    {
    //
    }

}

Laravel se conforme à l'architecture RESTful ce qui explique la présence de toutes ces méthodes. Pour clarifier un peu tout ça, voilà le code modifié avec un retour évocateur :

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
<?php
 
class mon_controleur extends BaseController {
 
    public function index()
    {
        return "Réponse de base";
    }
 
    // GET /ma_ressource/create
    public function create()
    {
        return "La ressource doit être créée ici";
    }
 
    // POST /ma_ressource
    public function store()
    {
        return "Ressource mémorisée";
    }
 
    // GET /ma_ressource/{id}
    public function show($id)
    {
        return "C'est ici qu'on montre la ressource ".$id;
    }
 
    // GET /ma_ressource/{id}/edit
    public function edit($id)
    {
        return "C'est ici qu'on modifie la ressource ".$id;
    }
 
    // PUT /ma_ressource/{id}
    public function update($id)
    {
        return "C'est ici qu'on met à jour la ressource ".$id;
    }
 
    // DELETE /ma_ressource/{id}
    public function destroy($id)
    {
        return "C'est ici qu'on supprime la ressource ".$id;
    }
 
}

On va aussi déclarer la ressource dans le fichier des routes, ce qui va avoir pour effet de créer toutes les routes correspondant à cette ressource avec une seule ligne de code :

 
Sélectionnez
Route::resource('ma_ressource', 'mon_controleur');

En réponse à http://localhost/laravel/public/ma_ressource j'obtiens donc :

Réponse de base

En réponse à http://localhost/laravel/public/ma_ressource/toto j'obtiens donc :

C'est ici qu'on montre la ressource toto

En réponse à http://localhost/laravel/public/ma_ressource/toto/edit j'obtiens donc :

C'est ici qu'on modifie la ressource toto

Pour les autres commandes il faut un peu plus d'intendance puisqu'on a les verbes POST, PUT et DELETE.

Par exemple pour l'enregistrement d'une ressource créez ce formulaire :

 
Sélectionnez
<form action="ma_ressource" method="post">
    <input name="Valider" type="submit">
</form>

Quand vous cliquez sur le bouton vous devez obtenir :

Ressource mémorisée

En ce qui concerne les méthodes PUT et DELETE la mise en œuvre est un peu plus délicate.

Si vous ne voulez pas toutes les fonctionnalités vous pouvez créer un contrôleur limité à vos besoins. La commande d'Artisan comprend les options -only et -except. Mais il faut aussi le signaler dans l'appel de la ressource. Par exemple si vous ne voulez que show et edit :

 
Sélectionnez
Route::resource('ma_ressource', 'mon_controleur',
array('only' => array('show', 'edit')));

Vous avez donc la possibilité d'utiliser ce type de contrôleur dans vos applications si vous voulez coller à l'architecture REST ou tout simplement partir sur une base cohérente.

Je donne un exemple completChapitre 22 : Installer des générateurs d'une ressource avec un générateur plus loin dans ce tutoriel.


précédentsommairesuivant

Copyright © 2017 Laravel. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.