Deployer Laravel sur Heroku : Un Tutoriel Approfondi
Pourquoi Deployer Laravel sur Heroku ?
Deployer Laravel sur Heroku est une option populaire pour les développeurs qui cherchent à déployer rapidement et facilement leurs applications PHP. Voici quelques raisons :
- Scalabilité : Heroku permet de mettre à l'échelle facilement votre application en fonction du trafic.
- Fournitures de service incluses : Heroku offre des services comme les bases de données, le stockage et la mise en cache intégrés.
- Environnement hôte sécurisé : Les applications sont exécutées dans un environnement sécurisé avec une forte protection contre les attaques.
Un cas d'usage concret : Imaginez que vous développez une application de gestion des tâches pour une petite entreprise. Vous voulez déployer cette application rapidement et facilement, tout en ayant la possibilité de l'échelle si nécessaire. Deployer sur Heroku serait une solution idéale.
Prerequis
Avant de commencer, vous devez avoir les éléments suivants :
- Connaissance approfondie de Laravel
- Un compte Heroku
- PHP 7.3 ou plus récent
- Composer pour la gestion des dépendances
- Git pour le contrôle de version
Les outils à installer sont :
## Installez Node.js (pour les assets)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
nvm install node
npm install -g yarn
## Installez Composer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
Concepts fondamentaux
1. Création de l'application Laravel
Pour créer une nouvelle application Laravel, utilisez Composer :
composer create-project --prefer-dist laravel/laravel task-manager "8.*"
cd task-manager
2. Configuration pour Heroku
Heroku nécessite quelques fichiers supplémentaires dans votre projet.
Procfile :
Créez un fichier Procfile à la racine de votre projet avec le contenu suivant :
web: php artisan serve --host=0.0.0.0 --port=$PORT
composer.json :
Ajoutez les dépendances nécessaires pour Heroku dans votre composer.json :
"require": {
"php": "^7.3",
"fideloper/proxy": "^4.0",
"laravel/framework": "^8.0"
},
"require-dev": {
"fakerphp/faker": "^1.9.1",
"facade/ignition": "^2.5",
"filp/whoops": "^2.7",
"fzaninotto/faker": "^1.9.1",
"friendsofphp/php-cs-fixer": "^3.0",
"laravel/tinker": "^2.5"
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
"@php artisan key:generate --force"
],
"post-create-project-cmd": [
"@php artisan migrate --seed --no-interaction"
]
}
runtime.txt :
Ajoutez une ligne runtime.txt à la racine de votre projet avec le contenu suivant :
php-7.4
3. Configuration de la base de données
Heroku utilise PostgreSQL par défaut. Vous devez configurer Laravel pour utiliser cette base de données.
.env.example et .env :
Modifiez les fichiers .env.example et .env pour ajouter les configurations suivantes :
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=${PGDATABASE}
DB_USERNAME=${PGUSER}
DB_PASSWORD=${PGPASSWORD}
Création du fichier de base de données Heroku :
Ajoutez un fichier database.php dans le répertoire config/database.php pour configurer les paramètres de connexion :
<?php
return [
'default' => env('DB_CONNECTION', 'pgsql'),
'connections' => [
'pgsql' => [
'driver' => 'pgsql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'schema' => 'public',
'sslmode' => 'prefer',
],
],
];
Mise en pratique : projet fil rouge
Nous allons créer un gestionnaire de tâches simple avec Laravel.
1. Création du modèle Task
php artisan make:model Task -m
2. Migration pour la table tasks
Modifier le fichier database/migrations/xxxx_xx_xx_xxxxxx_create_tasks_table.php :
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateTasksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description')->nullable();
$table->boolean('completed')->default(false);
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('tasks');
}
}
3. Exécution de la migration
php artisan migrate
4. Création du contrôleur TaskController
php artisan make:controller TaskController --resource
5. Ajout des routes dans web.php
Modifier le fichier routes/web.php :
Route::resource('tasks', 'TaskController');
6. Création de la vue pour les tâches
Créez un répertoire resources/views/tasks et ajoutez le fichier index.blade.php :
@extends('layouts.app')
@section('content')
<div class="container">
<h1>Tâches</h1>
<a href="route('tasks.create')" class="btn btn-primary mb-3">Nouvelle tâche</a>
<table class="table">
<thead>
<tr>
<th>Nom</th>
<th>Description</th>
<th>Statut</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
@foreach ($tasks as $task)
<tr>
<td>$task->name</td>
<td>$task->description ?? '-'</td>
<td>$task->completed ? 'Terminée' : 'En cours'</td>
<td>
<a href="route('tasks.edit', $task)" class="btn btn-sm btn-primary">Éditer</a>
<form action="route('tasks.destroy', $task)" method="POST" style="display: inline;">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-sm btn-danger">Supprimer</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endsection
7. Ajout de la vue pour la création et l'édition des tâches
Créez les fichiers create.blade.php et edit.blade.php dans le répertoire resources/views/tasks.
8. Configuration du fichier .env
Ajoutez les variables d'environnement nécessaires pour Heroku :
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=${PGDATABASE}
DB_USERNAME=${PGUSER}
DB_PASSWORD=${PGPASSWORD}
9. Push sur Heroku
Connectez-vous à votre compte Heroku et créez une nouvelle application :
heroku create task-manager-app
git init
git add .
git commit -m "Initial commit"
git push heroku master
Erreurs frequentes et debugging
1. The Mix manifest does not exist.
Code incorrect :
npm run dev
Code correct :
npm install --global laravel-mix
npm run production
git add .
git commit -m "Update package.json"
git push heroku master
2. PDOException: could not find driver
Code incorrect :
// config/database.php
'driver' => 'pgsql',
Code correct :
Ajoutez la extension PostgreSQL à votre fichier composer.json :
"require": {
"ext-pgsql": "*"
}
3. Call to undefined function App\Providers\AppServiceProvider::boot()
Code incorrect :
public function boot()
{
//
}
Code correct :
Ajoutez le namespace :
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
//
}
}
Pour aller plus loin
1. Utilisation de Docker pour Laravel
Découvrez comment utiliser Docker pour développer et déployer vos applications Laravel.
2. Optimisation des performances sur Heroku
Apprenez à optimiser les performances de votre application Laravel sur Heroku en utilisant les services inclus par défaut.
3. Création d'une API RESTful avec Laravel
Développez une API RESTful pour gérer vos tâches à l'aide de Laravel.
Défi pratique : Créer un scraper avec Laravel
Construire un simple scraper qui récupère des données depuis une page web et les stocke dans une base de données.
Ce tutoriel a couvert les aspects essentiels du déploiement d'une application Laravel sur Heroku. Vous devriez maintenant être en mesure de déployer vos propres applications sur cette plateforme puissante et flexible. N'oubliez pas de consulter la documentation officielle de Laravel et de Heroku pour plus de ressources et d'aide.