Créer un modèle Eloquent et une classe PHP

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Je dois réaliser un site internet avec le framework Laravel v5.0 (un fork de Symfony) et je suis complètement largué. Mon expérience pourtant plus que suffisante : j'ai réalisé des modules avec Prestashop, réalisé mes propres modèles MVC et codé des templates sous Wordpress. Et celui-ci me soûle tout simplement, sauf que je n'ai pas le choix car il s'agit d'un rendu universitaire. :)

Le projet consiste à réaliser une application pour les auto-écoles, je possède trois tables (utilisateur, consulter et trajet) et deux classes (utilisateur et trajet). Le principe d'Eloquent est de pouvoir utiliser une ORM (Object-Relational Mapping), c'est à dire qu'elle me permettra d'utiliser la POO pour interroger la BDD SQL. Pour ça, selon la documentation de Laravel, je dois créer un modèle.

1
2
3
4
5
6
7
8
<?php namespace App;

class Compte extends Model {
    protected $table = 'compte';
    public $timestamps = false;
}

?>

Déjà ici, je ne comprends pas très bien. Ils me disent "To get started, create an Eloquent model. Models typically live in the app directory, but you are free to place them anywhere that can be auto-loaded according to your composer.json file. All Eloquent models extend Illuminate\Database\Eloquent\Model."

J'ai beau cherché une documentation sur composer.json, je n'ai rien trouvé de spécifique à Laravel et encore moins sur l'emplacement des modèles. Du coup, j'ai enregistré Compte.php dans le répertoire /app.

On continue la documentation. Sans transition on arrive à l'utilisation … où est-ce que je place mon code ? J'ai cherché un peu et du coup je comprends qu'il faut l'indiquer dans le controller ou dans routes.php directement.

 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
<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
*/

//Route::get('/test', 'TestController@index');
//Route::get('/', 'BddController@index');

Route::get('/', function ()
{
    return Compte::all();
});

Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);

Je lance l'application en ouvrant http://localhost/laravel/public/ dans le navigateur. Et j'ai un beau message d'erreur :

1
2
3
Whoops, looks like something went wrong.
1/1 FatalErrorException in routes.php line 19:
Class 'Compte' not found

Du coup ma question c'est comment dire à Laravel que mon modèle se trouve dans /app ? Dans ma logique de PHP, je comprends que ce n'est pas magique d'écrire return Compte::all(); et qu'il faut forcément indiquer l'emplacement quelque part. Mais où ?

Pour mes classes PHP du coup je ne sais pas non plus où je peux les mettre. Dans le répertoire /tests ou un appel via le controller. Un peu de votre expérience me permettra au moins d'avancer.

Merci d'avance. Vous me sauverez la vie. ;)

Édité par Yarflam

Tant de choses, tant de vies, tant de possibilités.

+0 -0

Cette réponse a aidé l'auteur du sujet

Bonjour à toi,

je pense qu'il manque la ligne suivante dans ton model, après le namespace :

1
use Illuminate\Database\Eloquent\Model;

Il faut également lancer :

1
composer dump-autoload

après avoir ajouté un modèle.

Pour inclure une classe personnelle, pour ma part je fais comme suit :

1/ J'ai créé un dossier Libs dans le dossier App

2/ Dans les classes à l'intérieur de Libs (ici MaClasse), je mets au début :

1
namespace App\Libs;

3/ Si j'utilise MaClasse dans un contrôleur, au début de celui-ci :

1
use App\Libs\MaClasse;

Tu peux trouver des détails utiles en suivant CE LIEN.

EDIT : concernant l'utilisation des modèles n'importe où dans ton application, il y a encore des choses qui m'échappent avec la nouvelle version de Laravel.

Édité par leir

+0 -0
Auteur du sujet

Merci beaucoup Leir, j'ai réussi grâce à toi. :)

J'ai commencé à écrire un petit guide d'installation pour Laravel (configurer la BDD, créer une vue, une classe, un modèle, un controller, utiliser les sessions etc). Du coup je pense le publier d'ici quelques temps sur ZDS. Je te passerai les droits d'accès si t'as des précisions à rajouter. Ça pourrait être pas mal étant donné qu'il n'existe que la documentation officielle.

Édité par Yarflam

Tant de choses, tant de vies, tant de possibilités.

+0 -0

Tant mieux si ma réponse t'a aidé :)

Juste une petite précision en ce qui concerne les modèles. La bonne façon de faire est de déclarer le nouveau modèle comme suit :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
namespace App; // on peut bien sûr mettre un autre namespace, comme App/Models par exemple

use Illuminate\Database\Eloquent\Model;

class Article extends Model {

    protected $table = 'articles';

    protected $fillable = ['title', 'body'];

}

Un petit : composer dump-autoload si la classe n'est pas chargée.

Et ensuite, pour utiliser le modèle où l'on veut, il suffit de l'appeler avec le namespace avant (ce n'était pas tout à fait clair dans ma tête, et ça a changé depuis Laravel 4, c'est pour ça que je le mets ici). Soit par exemple, dans routes.php :

1
2
3
4
5
Route::get('articles', function(){

    return App\Article::all();

});

Comme je doutais sur ce coups-là, j'ai posé la question sur laravel.fr.

Pour info, il existe déjà un tutoriel sur Laravel sur openclassrooms, mais pour la version 4 (je crois que la mise à jour vers la version 5 est en cours). Il se trouve ICI. Il y a aussi l'excellent blog de bestmomo, ICI. D'ailleurs, l'auteur est le même pour les deux ressources ^^.

EDIT : pour le guide que tu as commencé, je peux volontiers y contribuer, dans les limites de mes possibilités. Je suis loin d'être un expert cependant ^^.

Édité par leir

+1 -0
Auteur du sujet

Je suis complètement hors sujet mais je tiens à le dire car c'est important, il faut éviter de spécifier les ?> dans ton code PHP.

Nek

Tu peux développer s'il te plaît ? :) Je sais pertinemment qu'on est pas obligé de le mettre, mais c'est tout de même une norme de codage … Et bon nombre de fois j'ai rencontré des codes sans ?> et ça m'a toujours questionné. Ton intervention pourrait peut-être y répondre.

Tant de choses, tant de vies, tant de possibilités.

+0 -0

Je suis complètement hors sujet mais je tiens à le dire car c'est important, il faut éviter de spécifier les ?> dans ton code PHP.

Nek

Tu peux développer s'il te plaît ? :) Je sais pertinemment qu'on est pas obligé de le mettre, mais c'est tout de même une norme de codage … Et bon nombre de fois j'ai rencontré des codes sans ?> et ça m'a toujours questionné. Ton intervention pourrait peut-être y répondre.

Yarflam

S'il y a un caractère après le ?>, il apparaîtra dans toutes les pages qui incluent ce fichier. En ne fermant pas, tu t'assures qu'il y en ait pas.

Édité par Cydonia7

+0 -0
Auteur du sujet

S'il y a un caractère après le ?>, il apparaîtra dans toutes les pages qui incluent ce fichier. En ne fermant pas, tu t'assures qu'il y en ait pas.

Cydonia7

Ah évidemment si on ne sait pas coder. :p

Bref, ce n'est qu'un détail - un choix de construction. D'autant qu’ors modèle MVC pur et dur (c'est à dire sans Twig, Blade, Smarty ou RainTPL), on a parfois besoin d'inclure du HTML à la fin.

Édité par Yarflam

Tant de choses, tant de vies, tant de possibilités.

+0 -0

Cette réponse a aidé l'auteur du sujet

C'est encore plus fort que ça. Un caractère peut également être: un espace.

Quand on sait que la convention veut qu'il y ai un espace à la fin de tout fichier (convention de logique / C / GIT / Github, google pour en savoir plus). Cela sous entends qu'il y a automatiquement un caractère après le ?>.

En PHP un espace en dehors du code PHP lui même signifie que PHP communique des données au client, ce qui provoque l'envoie des headers. Et l'envoie des headers signifie que tu ne peux plus utiliser de session_start ou de cookie, bien entendu cela veut également dire que tu ne peux plus spécifier de header et donc plus faire de redirection non plus.

Bref, retirer le ?> n'est pas seulement une bonne pratique, ça évite également beaucoup d'erreurs bêtes parfois difficile à traquer.

+0 -0
Auteur du sujet

C'est encore plus fort que ça. Un caractère peut également être: un espace.

Quand on sait que la convention veut qu'il y ai un espace à la fin de tout fichier (convention de logique / C / GIT / Github, google pour en savoir plus). Cela sous entends qu'il y a automatiquement un caractère après le ?>.

En PHP un espace en dehors du code PHP lui même signifie que PHP communique des données au client, ce qui provoque l'envoie des headers. Et l'envoie des headers signifie que tu ne peux plus utiliser de session_start ou de cookie, bien entendu cela veut également dire que tu ne peux plus spécifier de header et donc plus faire de redirection non plus.

Bref, retirer le ?> n'est pas seulement une bonne pratique, ça évite également beaucoup d'erreurs bêtes parfois difficile à traquer.

Nek

Effectivement, ce n'est pas idiot du tout. Je level up :)

Merci beaucoup pour ton intervention.

Édité par Yarflam

Tant de choses, tant de vies, tant de possibilités.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte