1 – Laravel : installation environnement de développement

Environnement de développement

Cet article présente une façon d’installer un environnement de développement LAMP + composer pour Laravel.

Pour commencer, il faut installer XAMPP. Pour cela, rien de plus simple, il faut suffit d’aller sur le site suivant et de suivre les instructions : https://www.apachefriends.org/fr/index.html

Composer

A rédiger installer composer… (voir lien sur machine virtuelle)

Nodejs

Installer Nodejs et npm simplement avec la commande suivante :

sudo apt-get update
sudo apt-get install nodejs npm

CHMOD

A rédiger : paramétrer chmod (voir lien sur machine virtuelle)

 

A rédiger : installer une application Laravel… (voir https://laravel.sillo.org/creer-une-application-avec-laravel-5-5-installation-et-style/)
A mettre dans un article à part entière ?

Upload d’une image

Introduction

Ce petit tutoriel explique comment sauvegarder un fichier « image » avec Yii 2.

Modèle de base

Le modèle de base sur lequel sont basé les opérations présentées ci-dessous est le suivant :

mdl

Dans ce tutoriel, nous allons nous concentrer uniquement sur la classe/table Site qui contient une image (logo du site).

Prérequis

Avoir créé le CRUD des deux modèles à l’aide de Gii.

Opérations à effectuer

Modèle

Pour commencer, il faut modifier le modèle Site afin d’y ajouter la variable $image et des règles concernant l’image.

# modeles/Site.php

class Site extends \yii\db\ActiveRecord
{
    public $image;

les règles :

# models/Site.php::rules()

// Other rules
[['image'], 'file', 'skipOnEmpty' => true,
    'maxSize' => 102400, 'extensions' => 'jpg, jpeg, png',
    'tooBig' => 'L\'image ne peut pas être plus grande que 100 Ko.',
    'wrongExtension' => 'L\'image doit être au format JPG ou PNG.',
    'on' => 'register'],
[['image'], 'file', 'skipOnEmpty' => false,
    'maxSize' => 102400, 'extensions' => 'jpg, jpeg, png',
    'tooBig' => 'L\'image ne peut pas être plus grande que 100 Ko.',
    'wrongExtension' => 'L\'image doit être au format JPG ou PNG.',
    'on' => 'update']

Dans cet exemple, l’image doit être de type jpg, jpeg ou png et ne doit pas être plus grande que 100 octets.

Form

Nous devons ensuite modifier le formulaire afin de permettre la sélection de l’image. Nous en profiterons pour épurer l’affichage du formulaire des données techniques de l’image (type et taille).

Il faut que le formulaire ait l’option enctype de type multipart/form-data.

use yii\widgets\ActiveForm;
$form = ActiveForm::begin(
  [
    'enableAjaxValidation' => false,
    'options' => ['enctype' => 'multipart/form-data'],
  ]
);

Ensuite, il faut supprimer les lignes suivantes car ces champs seront renseignés par le controller  :

    <?= $form->field($model, 'image_name')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'image_type')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'image_size')->textInput() ?>

Puis, il faut ajouter le champs « fichier » d’upload de l’image :

<?= $form->field($model, 'image')->fileInput() ?>

Controller

Finalement, nous allons voir comment récupérer et sauvegarder l’image. Pour ce faire, il faut modifier le controller controllers/SiteController.php.

Create

Nous allons commencer par modifier l’action actionCreate. Son état de base est le suivant :

public function actionCreate()
{
    $model = new Site();

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('create', [
            'model' => $model,
        ]);
    }
}

Il faut la modifier comme suite :

public function actionCreate()
{
    $model = new Site();

    if (Yii::$app->request->isPost) {
        $model->load(Yii::$app->request->post());
        $model->image = UploadedFile::getInstance($model, 'image');

        if($model->image !== null){
            $model->image_name = $model->mnemo . '.' . $model->image->extension;
            $model->image_type = $model->image->type;
            $model->image_size = $model->image->size;
        }
        if ($model->save()) {
            if($model->image !== null){
                $model->image->saveAs('chemin/vers/destination');
            }
            return $this->redirect(['view','id' => $model->id]);
        }    
    }
    return $this->render('create', ['model' => $model]);
}

Il faut également ajouter en début de document le namespace pour pouvoir utiliser le helper du même nom :

use yii\web\UploadedFile;

Update

Les modifications à apporter à l’action Update sont très similaire à l’action Create.

L’action sans modification est la suivante :

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if ($model->load(Yii::$app->request->post()) && $model->save()) {
        return $this->redirect(['view', 'id' => $model->id]);
    } else {
        return $this->render('update', [
            'model' => $model,
        ]);
    }
}

Nous la modifions comme suite :

public function actionUpdate($id)
{
    $model = $this->findModel($id);

    if (Yii::$app->request->isPost) {
        $model->load(Yii::$app->request->post());
        $upload = UploadedFile::getInstance($model, 'image');

        if($upload !== null){
            $model->image_name = $model->mnemo . '.' . $upload->extension;
            $model->image_type = $upload->type;
            $model->image_size = $upload->size;
        }
        if ($model->save()) {
            if($upload !== null){
                $model->image = $upload;

                $model->image->saveAs('chemin/vers/destination');
            }
            return $this->redirect(['view','id' => $model->id]);
        }    
    }
    return $this->render('update', ['model' => $model]);       
}

Delete

Il ne faut pas oublier de supprimer le fichier lors du lancement de l’action Delete. Pour ce faire, nous utilisons la fonction unlink de PHP.

Action d’origine :

public function actionDelete($id)
{
    $this->findModel($id)->delete();

    return $this->redirect(['index']);
}

Action modifiée :

public function actionDelete($id)
{
    $model = $this->findModel($id);
    $filename = $model->image_name;
        
    $model->delete();
        
    unlink('chemin/vers/destination' . $filename);

    return $this->redirect(['index']);
}

Remarques

Dans ce tutoriel, nous n’avons pas abordé plusieurs aspect qu’il est important de traiter dans un projet réel :

  • centraliser le chemin vers les image dans les paramètres de l’application

Paramétrage du framework

Le fichier bootstrap

Le bootstrap est le fichier par lequel toutes les requêtes vous passer et c’est lui qui va « orchestrer » l’application. Sur Yii2, c’est le fichier index.php du répertoire de l’application. Voici son contenu à la création d’un site « basic » avec Composer :

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

$config = require(__DIR__ . '/../config/web.php');

(new yii\web\Application($config))->run();

La modification principale à faire dans ce fichier est de définir le chemin d’accès aux fichiers du framework. Par exemple, si les fichiers de mon serveur doivent être dans le répertoire /httpdocs/, je déplace le contenu du répertoire web/ dedans et je créer un répertoire /yii2/ dans lequel je déplace le reste des fichiers. En imaginant l’arborescence suivante :

/

httpdocs/

yii2/

le fichier bootstrap devra être modifié en comme suite :

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/../yii2/vendor/autoload.php');
require(__DIR__ . '/../yii2/vendor/yiisoft/yii2/Yii.php');

$config = require(__DIR__ . '/../yii2/config/web.php');

(new yii\web\Application($config))->run();

Mise en production

Le de la mise en production, il faut désactiver le mode debug, pour ce faire, il faut remplacer la ligne

defined('YII_DEBUG') or define('YII_DEBUG', true);

par

defined('YII_DEBUG') or define('YII_DEBUG', false);

Configuration du site – web.php

Le fichier web.php contient un grand nombre de données de configuration du site. Il se trouve dans le répertoire config/ du framework.

Routage

Par défaut, les URL du site sont sous la forme suivante :

http://exemple.com/index.php?r=site/login

Il est possible de paramétrer le site afin d’obtenir une URL « propre sans le « index.php » :

http://exemple.com/site/login/

Pour ce faire, il faut commencer par activer PrettyUrl dans le fichier de configuration et cacher le fichier du bootstrap avec showScriptName :

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'components' => [
	    // divers composants
        'db' => require(__DIR__ . '/db.php'),
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ]
    ],
    'params' => $params,    
];

Pour ne pas avoir une erreur 404, il faut maintenant créer un fichier .htaccess contenant les données suivantes :

<IfModule mod_rewrite.c>
  RewriteEngine on
  # A decommenter et changer pour correspondre à l'URL de base:
  # RewriteBase /
  # Si un repertoire ou un fichier existe, utiliser directement la requete:
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  # Sinon, transmettre la requete a index.php:
  RewriteRule . index.php
</IfModule>

Gii

Gii est un générateur de code pour Yii2 qui permet de générer très rapidement des pages utilisables (par exemple, du CRUD sur la base de tables de base de données).

Par défaut, Gii est automatiquement chargé avec l’application basic chargée via Composer :

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yii\debug\Module';

    $config['bootstrap'][] = 'gii';
    //$config['modules']['gii'] = 'yii\gii\Module';
    $config['modules']['gii'] = [
    	'class' => 'yii\gii\Module',
    	//'allowedIPs' => ['*']
    ];
}

Gii est accessible par l’adresse « propre » (uniquement en local et sur un environnement de développement) :

http://exemple.com/gii/

 

Base de données – db.php

Le fichier db.php contient les données de configuration de base de données. Il se trouve dans le répertoire config/ du framework.

Il suffit de paramétrer le fichier avec les bonnes données :

<?php

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=nomDB',
    'username' => 'nomUtilisateurDb',
    'password' => 'motDePasse',
    'charset' => 'utf8',
];

Variables du site – params.php

A compléter…

Créer un nouveau site Yii2 avec Composer

Il y a plusieurs manière de créer un site Yii2. La solution la plus simple est d’utiliser Composer. De plus, elle permets d’installer, mettre à jour et gérer toutes les dépendances et extension de l’application.

Installer Composer

Composer peut être installer n’importe où.

Pour l’installer, il faut exécuter la commande suivante :

curl -sS https://getcomposer.org/installer | php

Il est également possible d’installer composer directement avec PHP :

php -r "readfile('https://getcomposer.org/installer');" | php

Pour plus de détails, se référer à la documentation du site officiel : https://getcomposer.org/.

Mettre à jour Composer

Pour mettre à jour composer, exécuter la commande suivante :

php /chemin/vers/composer.phar self-update

ou (dans le cas d’un installation globale) :

composer self-update

Installation du plugin Asset

Yii2 utilise le plugin Asset pour installer les librairies dépendantes. Pour l’installer, exécuter la commande suivante (modifier la version du plugin en allant sur https://getcomposer.org/ pour voir laquelle est la dernière) :

composer global require "fxp/composer-asset-plugin:1.1.3"

Créer le site

Créer un site en mode basic :

composer create-project --prefer-dist yiisoft/yii2-app-basic /chemin/ou/creer

Créer un site en mode advanced :

composer create-project --prefer-dist yiisoft/yii2-app-advanced /chemin/ou/creer

S’il y a un message avec un Token, copier/coller l’URL dans un browser et récupérer le token généré.

Cacher le « index.php » dans l’URL

Par défaut, les URLs d’une application sur Yii Framework affichent « index.php ». Voici comment le cacher.

Pour commencer, il faut que le mod_rewrite de PHP soit actif. Pour l’activer, il faut ouvrir le fichier httpd.conf et changer la ligne

#LoadModule rewrite_module modules/mod_rewrite.so

en

LoadModule rewrite_module modules/mod_rewrite.so

Ensuite, il faut créer un fichier .htaccess au même niveu que le fichier index.php.
Il faut y mettre :

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\?*$ index.php/$1 [L,QSA]

Si cela ne fonctionne pas, essayer avec :

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

Finalement, il faut ajouter la ligne « ‘showScriptName’=>false, » dans le fichier de configuration main.php comme suite :

'urlManager'=>array(
'urlFormat'=>'path',
'showScriptName'=>false,
//'caseSensitive'=>false,
),

Normalement, le tour est joué!
Enjoy

Installer PHPUnit sur Xampp

Créer un lien de pear dans /usr/bin/

Il faut ensuite mettre à jour la version de pear (en root) :

pear upgrade-all

Ensuite, on installe PHPUnit (toujours en root) :

pear channel-discover pear.phpunit.de

pear install phpunit/PHPUnit

Finalement, il faut créer un raccourcis de phunit sur /usr/bin/