Publié le

Utilisation de la base de données dans Laravel 5

Nous allons maintenant créer une nouvelle table categories qui contiendra comme son nom l’indique les catégories dans notre site à l’aide de l’outil migration de Laravel, créer le modèle et afficher les informations qu’elle contient dans une vue.

Créer une table avec l’outil de migration

Le fichier de migration permet à Laravel de créer des tables dans la base et d’en suivre les modifications. Pour cela, il faut bien sur avoir connecté la base de données… Pour utiliser l’outil de migration et générer les bases du fichier, écrivez la commande suivante en SSH.

php artisan make:migration create_categories_table

vous devez maintenant avoir un fichier nommé 2016_11_28_130745_create_categories_table.php dans le répertoire database/migrations. Il contient les bases requises. Nous allons ensuite le modifier pour y insérer les champs qui nous intéressent. Comme nous voulons ajouter les champs nom et parent, nous modifions comme suit:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateCategoriesTable extends Migration
{
 public function up()//fonction de création appelée lors de la commande: php artisan migrate
 {
 Schema::create('categories', function (Blueprint $table) {
 $table->increments('id');
 $table->string('name');
 $table->integer('parent')->default(0);
 $table->timestamps();//ajoute les champs created_at et updated_at
 });
 }

 public function down()//fonction inverse à la création appelée lors de la fonction : php artisan migrate:rollback
 {
 Schema::drop('categories');
 }
}

La liste des type de colonnes possible est disponible sur la doc de laravel. Pour exécuter le fichier de création, il suffit de faire la commande suivante qui aura pour effet de créer votre table categories dans la base de données:

php artisan migrate
// pour annuler les migrate dans l'ordre ou ils ont été effectués
// php artisan migrate:rollback

Créer le modèle correspondant à la table

Pour créer votre modèle, Laravel nous met a disposition un outil de création. Nous allons donc créer notre modèle Categorie qui comme vous l’avez constaté et au singulier. Pour créer ce modèle nous exécutons la commande suivant qui va généré le fichier et le placer dans le répertoire app\:

php artisan make:model Categorie

Nous ouvrons modifions ce fichier pour qu’il contiennent le code suivant:

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Model;

class Categorie extends Model
{
 use Notifiable; 
 
 protected $table = 'categories';//nom de notre table
 public $timestamps = true; //champs created_at updated_at 
 
 protected $fillable = [ //champs que l'on peut modifier
 'name',
 ];
 
}


protected $fillable = [] permet de signaler quels sont les champs que l’on pourra modifier. Si vous désirez utiliser l’approche inverse et ne signaler que ceux que l’on ne pourra pas modifier utiliser la notation suivante:  $guarded = [‘id’]; // inverse de $fillable

Afficher et modifier les données d’un table

Pour créer et afficher les données présentes dans la table, nous allons créer une controller, une vue et modifier le fichier web.php. Afin de donner plus rapidement un aperçu je vais tout modifier d’un coup et vous expliquer après.

Ajouter les lignes suivantes à la fin du fichier routes\web.php

Route::get('/categories', 'Frontend\CategoriesController@index');
Route::get('/categories/create', 'Frontend\CategoriesController@create');
Route::get('/categories/last/', 'Frontend\CategoriesController@last');
Route::get('/categories/first/', 'Frontend\CategoriesController@first');
Route::get('/categories/find/{categorieId}', 'Frontend\CategoriesController@find');
Route::get('/categories/{categorieId}', function ($categorieId) {
 return \App\Categorie::find($categorieId);
});

Créez le fichier app\Http\Controllers\Frontend\CategoriesController.php contenant ce qui suit:


 public function last()
 {
 $categorie = \App\Categorie::all()->last();
 return view('frontend.categories',array('categories'=>$categorie));
 }
 public function first()
 {
 $categorie = \App\Categorie::first();
 return view('frontend.categories',array('categories'=>$categorie));
 }
 public function create()
 {
 // méthode de création d'objets
 $categorie = \App\Categorie::create([
 'name'=>'categorie_'.mt_rand(0,200),
 ]);
 // autre méthode de création d'objets
 $new_cat = new \App\Categorie; // attention, il y a bien sur un NEW
 $new_cat->name = 'categorie_methode2_'.mt_rand(0,200);
 $new_cat->save();
 
 $categories = \App\Categorie::all();//retourne toutes les donnée
 return view('frontend.categories',array('categories'=>$categories));
 
 }
 public function find($categorieId)
 {
 $categories = \App\Categorie::where('name','like','%'.$categorieId.'%')->get()->first();
 return view('frontend.categories',array('categories'=>$categories));
 }
}

Et la vue contenant le code ci-dessous (resources\view\frontend\categories.php)

//nous regadrons si c'est une collection ou un objet pour utiliser 
//la même view sans avoir d'exception
if(sizeof($categories)>1){
 echo "***** Une collection ********
";
 foreach($categories as $cat)
 {
 echo $cat->id." ".$cat->name."
";
 }
} else {
 echo "******** Un objet ********
";
 print_r($categories->name);
}

Vous comprendrez très vite une fois les pages affichées.

http://www.votre-site.com/categories/create : Va créer automatiquement des catégories en appelant CategoriesController::create() et afficher la liste de toutes les catégories à l’aide de la vue.

http://www.votre-site.com/categories: Va afficher la liste de toutes les catégories à l’aide de la vue.

http://www.votre-site.com/categories/find/8 : Va utiliser la fonction find du controller CategoriesController.php pour trouver les categories ayant 8 dans leur nom. S’il n’y en a pas il n’affichera rien sinon il affichera la liste à l’aide de la vue que nous venons de créer.

http://www.votre-site.com/categories/1 : Retourne la catégorie ayant pour id 1 sans passer par une vue ou un controller. C’est le moyen le plus rapide de voir les données du modèle.

http://www.votre-site.com/categories/first : Retourne le premier enregistrement de la table

http://www.votre-site.com/categories/last: Retourne le dernierenregistrement de la table

Publié le

Helloworld – Premier controller et vue

Maintenant que Laravel est installé, nous allons créer la première page qui pourrait être la célèbre Helloworld.

Avant d’aller plus loin, il est utile de savoir que le fichier log de  Laravel se trouve a l’endroit suivant: storage/logs

Ce tuto va vous permettre de comprendre le système de routage, les contrôleurs et les vues. Nous allons créer la page About-Us. Les fichiers modifiés et crées sont les suivant:

Fichiers à modifier ou créer pour afficher une page

La première étape est de modifier le fichier routes/web.php et d’ajouter la gestion de la nouvelle URL. Pour ce faire ajouter la ligne suivante à la fin du fichier web.php.

Route::get('/About-us', 'Frontend\AboutUsController@index');

Cette ligne signale au système qu’au moment ou la page About-us est appelée, le contrôleur AboutUsController du dossier Frontend sera appelé et plus précisément la fonction index. (Le dossier frontend n’est pas indispensable mais uniquement crée dans un but de lisibilité.) Pour aller plus loin dans l’exemple il faut donc créer le fichier App\Http\Controllers\Frontend\AboutUsController.phpcontenant le code suivant:

namespace App\Http\Controllers\Frontend;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class AboutUsController extends Controller
{
    public function index()
    {
           return 'We are in the page AboutUsController';
    }
}

Comme vous l’aurez compris, lorsque l’on ouvre la page About-us, le texte suivant est affiché. We are in the page AboutUsControllerComme dans notre cas, nous voulons utiliser une vue, il suffit de l’ajouter et de signaler au controller d’utiliser notre vue. Pour ce faire, créez le fichier resources/views/frontend/aboutus.php contenant le code suivant: (le dossier frontend n’est pas indispensable mais uniquement crée dans un but de lisibilité.)

<?php
echo "<h1>About-us</h1>";
echo "<p>Page Helloworld!</p>";
phpinfo();
?>

L’exemple est maintenant terminé. Vous avez un exemple complet de routage avec controller et vue. Nous pouvons maintenant passer au chapitre suivant qui va vous apprendre à utiliser la base de donnée et faire les migrations.

Publié le

Installation de Laravel 5.4 sur serveur Ubuntu

Bien que soit disant simple, l’installation et la compréhension des fichiers nécessaires à l’utilisation de Laraval peuvent poser parfois quelques problèmes. Je mets donc ici la marche à suivre que j’utilise pour mettre en place un nouveau site sur un serveur Ubuntu 16 avec PHP7 afin qu’elle puisse être utile à d’autres.

Pour installer avec composer j’ai besoin de curl et composer. Je les installe de la façon suivante:

sudo apt-get install php-curl
sudo apt-get install curl
sudo apt-get install php7.0-zip

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer.phar
alias composer='/usr/local/bin/composer.phar'

Connecter vous en ssh et aller dans votre dossier public. Dans mon cas: home/web-presence/public_html:

composer global require "laravel/installer"
composer create-project --prefer-dist laravel/laravel webp
Aperçu de la console lors de l’installation de Laravel

Je déplace ensuite le contenu de mon dossier webp dans son dossier parent puis le contenu du dossier public dans mon dossier public_html. Mon dossier public (public_html) ressemble maintenant à cela:

Dans mon cas, je mets ensuite le user et group correspondant à mon virtual server:

chown -R www-data:www-data *

Pour ne pas avoir une page blanche sur la page d’accueil du site Laravel et dans mes log(var\log\vistualmin\xxx.log) d’erreurs le message suivant:

[autoindex:error] [pid 21829] AH01276: Cannot serve directory /home/xxxxxxx.com/public_html/: No matching DirectoryIndex (index.html,index.htm,index.php,index.php4,index.php5) found, and server-generated directory index forbidden by Options directive

Je signale à Laravel que je n’utilise pas un dossier public mais public_html en modifiant le fichier index.php de la sorte.

$app = require_once __DIR__.'/../bootstrap/app.php';
echo __DIR__;
// set the public path to this directory
$app->bind('path.public', function() {
    return __DIR__;
});

Si j’essaie d’afficher la page, j’ai à nouveau une page blanche et dans mes log(var\log\vistualmin\xxx.log) d’erreurs le message suivant:

[:error] [pid 24658] PHP Fatal error: Uncaught UnexpectedValueException: The stream or file « /home/xxxxxxx.com/storage/logs/laravel.log » could not be opened: failed to open stream: Permission denied in /home/xxxxxxx.com/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107\nStack trace:\n#0 /home/xxxxxxx.com/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37):

Il faut donc que je modifie certains droits d’accès à mes fichiers. J’exécute donc les commandes suivantes pour changer les droits d’écriture et lecture::

sudo chmod -R 777 storage
sudo chmod -R 777 bootstrap/cache
Vous devriez maintenant avoir la page suivante visible:
Page d’accueil standard Laravel

Pour installer et lier la base de données, modifiez le fichier .env  (qui est parfois un fichier caché) et entrez les informations de connexion:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=********
DB_USERNAME=********
DB_PASSWORD=*********

Si le fichier .env n’est pas modifié, vous risquez d’avoir l’erreur suivante:

[Illuminate\Database\QueryException] SQLSTATE[HY000] [1045] Access denied for user ‘homestead’@’localhost’ (using password: YES) (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations)

Pour créer les tables de la base de données, il suffit maintenant d'effectuer la commande:
php artisan migrate

Elle va créer les tables migrations, password_resets, users

#Comme j'utilise laravelcollective/html je l'installe aussi (optionnel)
composer require laravelcollective/html
php artisan cache:clear

Nous pouvons maintenant passer au chapitre suivant qui va vous apprendre à les bases des vues et contrôleurs laravel.