Table des matières

Laravel

Documentation

Tuto en français

Installation

FIXME La dernière version 4.2 bug sous chrome et je n’ai pas trouvé de solution pour que ça marche, il faut donc forcer l’installation de la version 4.1 avec la commande

composer.phar create-project laravel/laravel=4.1.* nom-du-projet --prefer-dist

Problème du début

Sur une mariaDB, l’erreur suivante sur une migration

 [Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes (SQL: alter table `users` add unique `users_email_unique`(`email`))



  [PDOException]
  SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

Ajuster le app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema;
 
public function boot()
{
    Schema::defaultStringLength(191);
}

Convention de nommage

Laravel Schema Designer ⇒ http://www.laravelsd.com/ permet de créer des bases de données avec la souris puis de télécharger les fichiers de model, view et schema.

ATTENTION au pluriel et singulier !!!

Pour que tout se passe bien, nommé vos tables au pluriel, vos modèles au singulier, votre id doit s’appeler id…

Bref, voici un schéma

Pour stocker des articles

Table: articles
Champ: id, user_id, titre, contenu...

Commentaires des articles

Table: Commentaires
Champ: id, article_id, user_id, contenu...

Si on veut faire une table pivot, on nomme la table par ordre alphabétique du nom au singulier des deux tables concernées et elle doit contenir les 2 clés étrangères correspondantes

Table: article_commentaire
Champ: article_id, commentaire_id

D’autres explications et schéma par là ⇒ http://laravel.sl-creation.org/laravel-4-chapitre-33-les-relations-avec-eloquent-1/

Models et relation

Un article peut contenir plusieurs commentaires, nous allons définir la relation un-vers-plusieurs et regarder comment récupérer les données qu’il nous faut.

<?php
/**
* Article
*/
class Article extends Eloquent{  // Nom de la class au singulier
        // Automatiquement la table articles sera lié
 
	public function commentaires(){
		return $this->hasMany('Commentaire'); // le champ article_id sera utilisé par défaut
                // sinon spécifié le champ de la table commentaire qui fait le lien
                // ...hasMany('Commentaire','id_articles')
 
	}
 
}
<?php
/**
* Commentaire
*/
class Commentaire extends Eloquent{  // Nom de la class au singulier
        // Automatiquement la table commentaires sera lié
 
	public function article(){
		return $this->belongsTo('Article'); // le champ article_id sera utilisé par défaut
                // sinon spécifié le champ de la table commentaire qui fait le lien
                // ...belongsTo('Commentaire','id_articles')
 
	}
 
}

Maintenant nous voulons afficher les 10 derniers commentaires en spécifiant le titre de l’article.

// On récupère les 10 derniers éléments les plus récents de la table commentaires
$lastCommentaires = Commentaire::orderBy('created_at','desc')->take(10)->get();
 
// On boucle sur les enregistrements
foreach ($lastCommentaires as $c) {
  echo 'Commentaire du '.$c->created_at." pour l'article ".$c->article()->first()->titre.'<br>';
  // ou en écriture simplifié
  echo 'Commentaire du '.$c->created_at." pour l'article ".$c->article->titre.'<br>';
}

Ajouter ses class ou fonctions

Créez un fichier helpers.php dans par exemple app/ puis ajoutez-le dans le app/Providers/AppServiceProvider.php

<?php
 
namespace App\Providers;
 
use Illuminate\Support\ServiceProvider;
 
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        require_once(app_path().'/helpers.php');
    }
 
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Pour ajouter un répertoire contenant des fichiers de class, Créez par exemple un dossier app\MyClass et posez votre fichier de class suivant la norme psr-4

exemple :

vi app/MyClass/MaClass.php
<?php
 
// important !
namespace App\MyClass;
 
// le nom de la class doit être le même que le nom du fichier
class MaClass
{
 
}
 
/*
Pour utiliser cette class dans un autre fichier, ajoutez
use App\MyClass\MaClass;
*/

Mettre en français strftime

Ajoutez dans la fonction boot app/Providers/AppServiceProvider.php

setlocale(LC_ALL, 'fr_FR.UTF-8');

Même remarque pour mettre Carbon en français

Carbon::setLocale(config('app.locale'));

La config app.locale doit être à fr

Intégrer le framework en dehors de public

// Intégration du framework
require __DIR__.'/bootstrap/autoload.php';
$app = require_once __DIR__.'/bootstrap/start.php';