Facilite l'implémentation de l'authentification, la sécurité, le routage, etc.
{
"name": "laravel/framework",
"description": "The Laravel Framework.",
"keywords": ["framework", "laravel"],
"license": "MIT",
"homepage": "https://laravel.com",
"support": {
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"authors": [
{
"name": "Taylor Otwell",
"email": "taylor@laravel.com"
}
],
"require": {
"php": "^8.3",
"ext-ctype": "*",
"ext-filter": "*",
"ext-hash": "*",
"ext-mbstring": "*",
"ext-openssl": "*",
"ext-session": "*",
"ext-tokenizer": "*",
"composer-runtime-api": "^2.2",
"brick/math": "^0.11|^0.12|^0.13|^0.14",
"doctrine/inflector": "^2.0.5",
"dragonmantank/cron-expression": "^3.4",
"egulias/email-validator": "^3.2.1|^4.0",
"fruitcake/php-cors": "^1.3",
"guzzlehttp/guzzle": "^7.8.2",
"guzzlehttp/uri-template": "^1.0",
"laravel/prompts": "^0.3.0",
"laravel/serializable-closure": "^1.3|^2.0",
"league/commonmark": "^2.7",
"league/flysystem": "^3.25.1",
"league/flysystem-local": "^3.25.1",
"league/uri": "^7.5.1",
"monolog/monolog": "^3.0",
"nesbot/carbon": "^3.8.4",
"nunomaduro/termwind": "^2.0",
"psr/container": "^1.1.1|^2.0.1",
"psr/log": "^1.0|^2.0|^3.0",
"psr/simple-cache": "^1.0|^2.0|^3.0",
"ramsey/uuid": "^4.7",
"symfony/console": "^7.4.0|^8.0.0",
"symfony/error-handler": "^7.4.0|^8.0.0",
"symfony/finder": "^7.4.0|^8.0.0",
"symfony/http-foundation": "^7.4.0|^8.0.0",
"symfony/http-kernel": "^7.4.0|^8.0.0",
"symfony/mailer": "^7.4.0|^8.0.0",
"symfony/mime": "^7.4.0|^8.0.0",
"symfony/polyfill-php84": "^1.33",
"symfony/polyfill-php85": "^1.33",
"symfony/process": "^7.4.0|^8.0.0",
"symfony/routing": "^7.4.0|^8.0.0",
"symfony/uid": "^7.4.0|^8.0.0",
"symfony/var-dumper": "^7.4.0|^8.0.0",
"tijsverkoyen/css-to-inline-styles": "^2.2.5",
"vlucas/phpdotenv": "^5.6.1",
"voku/portable-ascii": "^2.0.2"
},
"replace": {
"illuminate/auth": "self.version",
"illuminate/broadcasting": "self.version",
"illuminate/bus": "self.version",
"illuminate/cache": "self.version",
"illuminate/collections": "self.version",
"illuminate/concurrency": "self.version",
"illuminate/conditionable": "self.version",
"illuminate/config": "self.version",
"illuminate/console": "self.version",
"illuminate/container": "self.version",
"illuminate/contracts": "self.version",
"illuminate/cookie": "self.version",
"illuminate/database": "self.version",
"illuminate/encryption": "self.version",
"illuminate/events": "self.version",
"illuminate/filesystem": "self.version",
"illuminate/hashing": "self.version",
"illuminate/http": "self.version",
"illuminate/json-schema": "self.version",
"illuminate/log": "self.version",
"illuminate/macroable": "self.version",
"illuminate/mail": "self.version",
"illuminate/notifications": "self.version",
"illuminate/pagination": "self.version",
"illuminate/pipeline": "self.version",
"illuminate/process": "self.version",
"illuminate/queue": "self.version",
"illuminate/reflection": "self.version",
"illuminate/redis": "self.version",
"illuminate/routing": "self.version",
"illuminate/session": "self.version",
"illuminate/support": "self.version",
"illuminate/testing": "self.version",
"illuminate/translation": "self.version",
"illuminate/validation": "self.version",
"illuminate/view": "self.version",
"spatie/once": "*"
},
"require-dev": {
"ext-gmp": "*",
"ably/ably-php": "^1.0",
"aws/aws-sdk-php": "^3.322.9",
"fakerphp/faker": "^1.24",
"guzzlehttp/promises": "^2.0.3",
"guzzlehttp/psr7": "^2.4",
"laravel/pint": "^1.18",
"league/flysystem-aws-s3-v3": "^3.25.1",
"league/flysystem-ftp": "^3.25.1",
"league/flysystem-path-prefixing": "^3.25.1",
"league/flysystem-read-only": "^3.25.1",
"league/flysystem-sftp-v3": "^3.25.1",
"mockery/mockery": "^1.6.10",
"opis/json-schema": "^2.4.1",
"orchestra/testbench-core": "^11.0.0",
"pda/pheanstalk": "^5.0.6|^7.0.0",
"php-http/discovery": "^1.15",
"phpstan/phpstan": "^2.0",
"phpunit/phpunit": "^11.5.50|^12.5.8",
"predis/predis": "^2.3|^3.0",
"resend/resend-php": "^0.10.0|^1.0",
"symfony/cache": "^7.4.0|^8.0.0",
"symfony/http-client": "^7.4.0|^8.0.0",
"symfony/psr-http-message-bridge": "^7.4.0|^8.0.0",
"symfony/translation": "^7.4.0"
},
"conflict": {
"tightenco/collect": "<5.5.33"
},
"provide": {
"psr/container-implementation": "1.1|2.0",
"psr/log-implementation": "1.0|2.0|3.0",
"psr/simple-cache-implementation": "1.0|2.0|3.0"
},
"autoload": {
"files": [
"src/Illuminate/Collections/functions.php",
"src/Illuminate/Collections/helpers.php",
"src/Illuminate/Events/functions.php",
"src/Illuminate/Filesystem/functions.php",
"src/Illuminate/Foundation/helpers.php",
"src/Illuminate/Log/functions.php",
"src/Illuminate/Reflection/helpers.php",
"src/Illuminate/Support/functions.php",
"src/Illuminate/Support/helpers.php"
],
"psr-4": {
"Illuminate\\": "src/Illuminate/",
"Illuminate\\Support\\": [
"src/Illuminate/Macroable/",
"src/Illuminate/Collections/",
"src/Illuminate/Conditionable/",
"src/Illuminate/Reflection/"
]
}
},
"autoload-dev": {
"files": [
"tests/Database/stubs/MigrationCreatorFakeMigration.php"
],
"psr-4": {
"Illuminate\\Tests\\": "tests/"
}
},
"extra": {
"branch-alias": {
"dev-master": "13.0.x-dev"
}
},
"suggest": {
"ext-apcu": "Required to use the APC cache driver.",
"ext-fileinfo": "Required to use the Filesystem class.",
"ext-ftp": "Required to use the Flysystem FTP driver.",
"ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
"ext-memcached": "Required to use the memcache cache driver.",
"ext-pcntl": "Required to use all features of the queue worker and console signal trapping.",
"ext-pdo": "Required to use all database features.",
"ext-posix": "Required to use all features of the queue worker.",
"ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0|^6.0).",
"ably/ably-php": "Required to use the Ably broadcast driver (^1.0).",
"aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.322.9).",
"brianium/paratest": "Required to run tests in parallel (^7.0|^8.0).",
"fakerphp/faker": "Required to generate fake data using the fake() helper (^1.23).",
"filp/whoops": "Required for friendly error pages in development (^2.14.3).",
"laravel/tinker": "Required to use the tinker console command (^2.0).",
"league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.25.1).",
"league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.25.1).",
"league/flysystem-path-prefixing": "Required to use the scoped driver (^3.25.1).",
"league/flysystem-read-only": "Required to use read-only disks (^3.25.1)",
"league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.25.1).",
"mockery/mockery": "Required to use mocking (^1.6).",
"pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).",
"php-http/discovery": "Required to use PSR-7 bridging features (^1.15).",
"phpunit/phpunit": "Required to use assertions and run tests (^11.5.50|^12.5.8).",
"predis/predis": "Required to use the predis connector (^2.3|^3.0).",
"psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
"pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).",
"resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0|^1.0).",
"symfony/cache": "Required to PSR-6 cache bridge (^7.4|^8.0).",
"symfony/filesystem": "Required to enable support for relative symbolic links (^7.4|^8.0).",
"symfony/http-client": "Required to enable support for the Symfony API mail transports (^7.4|^8.0).",
"symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^7.4|^8.0).",
"symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^7.4|^8.0).",
"symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^7.4|^8.0)."
},
"config": {
"sort-packages": true,
"audit": {
"ignore": {
"GHSA-vvj3-c3rp-c85p": "Ensure testing features are compatible with affected PHPUnit versions"
}
},
"allow-plugins": {
"composer/package-versions-deprecated": true,
"php-http/discovery": false
}
},
"minimum-stability": "dev",
"prefer-stable": true
}
https://github.com/laravel/framework/blob/master/composer.json
Ajouter composer à votre PATH selon votre système.
Ex de solution pour linux:
sudo mv composer.phar /usr/local/bin/composer
Liens vers la documentation:
Installation de l’installateur Laravel globalement sur votre machine
(seulement la première fois)
composer global require laravel/installer
Création d'un nouveau projet laravel dans le répertoire example-app
laravel new example-app
create-project
Création un nouveau projet laravel dans un répertoire exemple-app
composer create-project laravel/laravel example-app
cd exemple-app
npm install && npm run build
Nouvelle méthode
Se placer dans le répertoire du projet (cd exemple-app), puis:
composer run dev
Ancienne méthode
Laravel inclut un outil pour la ligne de commande: artisan
artisan offre, entre autre, un serveur web local.
Pour l’utiliser, on se place dans le projet (cd exemple-app), puis:
php artisan serve
On peut accéder ensuite à l'application avec l’url: http://localhost:8000
.env permet de configurer l’application (database, etc)bootstrap/cache et storage doivent être accessible en écriture pour que Laravel puisse y créer des fichiers.git clone https://github.com/MIASHS-UGA-PWS/example-cours-2026)
On initialise le projet et installe les dépendances (composer run setup)
git clone https://github.com/MIASHS-UGA-PWS/example-cours-2026
composer run setup
.env (cp .env.example .env)composer install)npm install && npm run build)php artisan key:generate)touch database/database.sqlite)php artisan migrate)git pull pour récupérer les mises à jour du projet.On peut ensuite lancer le projet:
composer run dev
app/Modelsapp/Http/Controllersresources/viewsroutes/web.php Voyons comment fonctionne l'application de base.
Tout d'abord lançons l'application:
composer run dev
puis ouvrons http://localhost:8000
Que ce passe t'il?
routes/web.
En fonction de l'url demandé (ici /),y l'action ne sera pas la même.
Route::get('/', function () {
return view('welcome');
});
resources/views/welcome.blade.php sera retournéAjout d’une nouvelle route
Route::get('/welcome', function () {
return view('welcome');
});
Retour chaine
Route::get('/', function () {
return "Hello World";
});
Retour json
Route::get('/', function () {
return ['foo' => 'bar'];
});
Retour nouvelle vue
Route::get('/test', function () {
return view('test');
});
→ erreur
→ on créer la vue (resources/views/test.blade.php)
Route::get('/', function () {
$name = request('name');
return $name;
});
Qu’est-ce qu’un système de templating (En anglais: template processor, template engine ou template parser) ?
Son rôle est d’aider dans la lisibilité et la logique du projet en général. Au lieu d’écrire directement du PHP dans le code HTML, on va utiliser le langage du système de Templating (Pour Laravel, c’est Blade, mais il en existe d’autres: Smarty, Twig, etc.)
Par exemple, pour un menu qui doit être le même sur plusieurs page, on peut créer un fichier template menu.blade.php puis l’utiliser ensuite dans d’autre fichiers template avec : @extends(menu)
Similaire à l’utilisation de include avec PHP, mais dans ce cas, on sépare bien le langage utilisé pour les templates et les vues et le code PHP.
Dans le template (layout.blade.php)
@yield('title','Titre par défaut') // valeur par défaut
@yield('content')
Dans la vue (home.blade.php)
@extends('layout')
{{-- On peut aussi déclarer la section en inline --}}
{{-- @section('title','Title - Home') --}}
@section('content')
<h1>Home</h1>
@endsection
Route (Routes/web.php)
Route::get('/', function () {
return view('home');
});
Route::get('/', function () {
$tasks = [
'Aller faire les courses',
'Aller à la gym',
'Dormir'
];
return view('home',[
'tasks' => $tasks
]);
});
@extends('layout')
@section('title','<h1>Home</h1>')
@section('content')
<ul>
<?php foreach ($tasks as $task ) : ?>
<li><?= $task; ?></li>
<?php endforeach; ?>
</ul>
@endsection
Route::get('/', function () {
$tasks = [
'Aller faire les courses',
'Aller à la gym',
'Dormir'
];
return view('home',[
'tasks' => $tasks
]);
});
@extends('layout')
@section('title','<h1>Home</h1>')
@section('content')
<ul>
@foreach ($tasks as $task )
<li>{{ $task }}</li>
@endforeach
</ul>
@endsection
Route::get('/', function () {
$tasks = [
'Aller faire les courses',
'Aller à la gym',
'Dormir'
];
return view('home',[
'tasks' => $tasks,
'test' => 'Mon test'
]);
});
@extends('layout')
@section('title','<h1>Home</h1>')
@section('content')
<h2>{{ $test }}</h2>
<ul>
@foreach ($tasks as $task )
<li>{{ $task }}</li>
@endforeach
</ul>
@endsection
Route::get('/', function () {
$tasks = [
'Aller faire les courses',
'Aller à la gym',
'Dormir'
];
return view('home',[
'tasks' => $tasks,
'test' => request('title')
]);
});
@extends('layout')
@section('title','<h1>Home</h1>')
@section('content')
<h2>{{ $test }}</h2>
<ul>
@foreach ($tasks as $task )
<li>{{ $task }}</li>
@endforeach
</ul>
@endsection
Route::get('/', function () {
$tasks = [
'Aller faire les courses',
'Aller à la gym',
'Dormir'
];
return view('home',[
'tasks' => $tasks,
'test' => '<script>alert("coucou")</script>'
]);
});
@extends('layout')
@section('title','<h1>Home</h1>')
@section('content')
<h2>{{ $test }}</h2>
<ul>
@foreach ($tasks as $task )
<li>{{ $task }}</li>
@endforeach
</ul>
@endsection
{{ $test }} est un peu plus que <?= $test; ?>{!! $test !!} attention!!!!Route::get('/', function () {
$tasks = [
'Aller faire les courses',
'Aller à la gym',
'Dormir'
];
return view('home',[
'tasks' => $tasks,
'test' => 'Mon test'
]);
// ou
return view('home')->withTasks($tasks)->withTest('Mon test with 1');
// ou
return view('home')->with([
'tasks' => $tasks,
'test' => 'Mon test with 2'
]);
});
Route::get('/', function () {
return view('home',[
'title' => 'Home'
]);
});
@extends('layout')
@section('title')
<h1>{{ $title }}</h1>
@endsection
@section('content')
<p>Contenu de la page d'accueil</p>
@endsection
On va maintenant rediriger nos requêtes vers des controllers
/*
Route::get('/', function () {
return view('home',[
'title' => 'Home'
]);
});
*/
use App\Http\Controllers\PagesController;
Route::get('/', [PagesController::class, 'home']);
→ erreur car le controller n'existe pas.
→ On pourrait aller dans app/Http/Controllers et créer un controller mais…
L’outil artisan permet aussi la création de fichiers dans l’application!
php artisan make:controller PagesController
Le fichier est automatiquement créé dans app/Http/Controllers
Ensuite, on peut ajouter la méthode home et inclure le code que l’on utilisait
pour appeler la view:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PagesController extends Controller
{
public function home()
{
return view('home',[
'title' => 'Home'
]);
}
}
On va «router» de nouvelles url vers de nouvelles méthodes de notre controller Routes/web.php
Route::get('/', [PagesController::class, 'home']);
Route::get('/about', [PagesController::class, 'about']);
Route::get('/contact', [PagesController::class, 'contact']);
Puis on va ajouter de nouvelles méthode à notre controller app/Http/Controllers/PagesController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PagesController extends Controller
{
public function home()
{
return view('home',[
'title' => 'Home'
]);
}
public function about()
{
return view('about');
}
public function contact()
{
return view('contact');
}
}
On créer les vues about.blade.php et contact.blade.php
@extends('layout')
@section('title')
<h1>{{ $title }}</h1>
@endsection
@section('content')
<p>Contenu de la page about</p>
@endsection
On ajoute le title dans les données qu'on passe à notre vue dans le controller
public function about()
{
return view('about',[
'title' => 'About'
]);
}
public function contact()
{
return view('contact',[
'title' => 'Contact'
]);
}
Création d’un projet avec composer:
(ou l'outil laravel laravel new project)
composer create-project laravel/laravel example-app
routes/web.phpapp/Http/ControllersIls peuvent être générés automatiquement avec la commande:
php artisan make:controller MonController
resources/viewsOn peut passer de la données au vue en second paramètre de la fonction view
$monTableauData = ['attr' => 'value', 'attr2' => 'value2'];
return view('mavue', $monTableauData);
{{$attr}}.envDB_CONNECTION=sqlite
DB_DATABASE=/ABSOLUTE_PATH/database/database.sqlite
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=
On lance ensuite en ligne de commande la commande suivante:
php artisan migrate
php artisan migrate:
php artisan migrate:rollbackdatabase/migrations/create_users_table.phpname en usernameOn lance un rollback:
php artisan migrate:rollback
On relance ensuite:
php artisan migrate
On peut facilement réinitialiser une base de données si on veut “recommencer”
On lance la commande:
php artisan migrate:fresh
Cette commande efface toutes les tables puis relance la migration
!!! Attention… à utiliser avec parcimonie et surtout pas en production !!!
Pour créer des nouvelles migrations, on peut utiliser artisan
Description de la commande:
php artisan help make:migration
Création d’une migration:
php artisan make:migration create_projects_table
database/migrations/create_projects_table.php :<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('projects', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('projects');
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('projects', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('projects');
}
};
Pour exécuter notre nouvelle migration:
php artisan migrate
php artisan migrate
On peut revenir en arrière:
php artisan migrate:rollback
migrate:fresh.envphp artisan migratephp artisan migrate:freshEloquent est l’ ORM (Object Relational Mapping) de Laravel.
Un ORM permet à un modèle d’interagir facilement avec la base de données (sa table, mais aussi ses relations)
Pour créer un nouveau modèle:
php artisan make:model Project
app/Models/Project.php
Tinker est un outil artisan qui permet d’interagir avec la base de données depuis la ligne de commande. En réalité, on peut accéder aux fonctionnalités de Laravel, depuis la ligne de commande, pour effectuer des tests, essais, vérifications, création, etc.
→ On le lance avec la commande:
php artisan tinker
php artisan tinker
Psy Shell v0.12.0 (PHP 8.3.2 — cli) by Justin Hileman
> 2+2
= 4
> App\Models\Project::all();
= Illuminate\Database\Eloquent\Collection {#5761
all: [],
}
> use App\Models\Project;
> Project::all();
= Illuminate\Database\Eloquent\Collection {#5710
all: [],
}
> Project::first();
= null
> Project::latest()->first();
= null
> $project = new Project;
= App\Models\Project {#4994}
> $project->title = 'Mon premier projet';
= "Mon premier projet"
> $project->description = 'Lorem ipsum';
= "Lorem ipsum"
> $project
= App\Models\Project {#4994
title: "Mon premier projet",
description: "Lorem ipsum",
}
> $project->save();
= true
→ On peut vérifier que l’objet a bien été créé dans la base de données.
php artisan tinker
Psy Shell v0.12.0 (PHP 8.3.2 — cli) by Justin Hileman
> Project::first();
= App\Models\Project {#4995
id: 1,
title: "Mon premier projet",
description: "Lorem ipsum",
created_at: "2024-02-05 22:58:45",
updated_at: "2024-02-05 22:58:45",
}
> Project::first()->title;
= "Mon premier projet"
> Project::first()->description;
= "Lorem ipsum"
> Project::all();
= Illuminate\Database\Eloquent\Collection {#5985
all: [
App\Models\Project {#5975
id: 1,
title: "Mon premier projet",
description: "Lorem ipsum",
created_at: "2024-02-05 22:58:45",
updated_at: "2024-02-05 22:58:45",
},
],
}
→ On créer un nouveau projet
> $project = new Project;
= App\Models\Project {#5829}
> $project->title = 'Mon projet 2';
= "Mon projet 2"
> $project->description = 'Lorem ipsum 2';
= "Lorem ipsum 2"
> $project->save();
= true
> Project::all();
= Illuminate\Database\Eloquent\Collection {#5984
all: [
App\Models\Project {#5975
id: 1,
title: "Mon premier projet",
description: "Lorem ipsum",
created_at: "2024-02-05 22:58:45",
updated_at: "2024-02-05 22:58:45",
},
App\Models\Project {#5009
id: 2,
title: "Mon projet 2",
description: "Lorem ipsum 2",
created_at: "2024-02-05 23:04:15",
updated_at: "2024-02-05 23:04:15",
},
],
}
Project::all();
Project::all()[0];
Project::all()[1];
Project::all()[1]->title;
Project::all()->map->title;
Nous allons faire un exemple complet MVC d'une page affichant des "projets" stocker en base de données.
Il nous faut:
/project
On définit les routes de l’application dans le fichier routes/web.php
use App\Http\Controllers\ProjectController;
Route::get('/project', [ProjectController::class, 'index']);
On créer un nouveau controller avec la commande:
php artisan make:controller ProjectController;
→ Le fichier est créé dans: app/Http/Controller/ProjectController.php
On ajoute une méthode index
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProjectController extends Controller
{
//
public function index()
{
return view('project.index');
}
}
resources/views : project/index.blade.php view('folder.file')composer run dev et on peut voir la page dans le navigateurindex du contrôleur ProjectsControllerOn va récupérer les projets:
$projects = \App\Models\Project::all();
ou
use App\Models\Project;
$projects = Project::all();
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Project;
class ProjectController extends Controller
{
//
public function index()
{
$projects = Project::all();
return $projects;
}
}
→ return json
[
{
"id": 1,
"title": "Mon premier projet",
"description": "Lorem ipsum",
"created_at": "2024-02-05T22:58:45.000000Z",
"updated_at": "2024-02-05T22:58:45.000000Z"
},
{
"id": 2,
"title": "Mon projet 2",
"description": "Lorem ipsum 2",
"created_at": "2024-02-05T23:04:15.000000Z",
"updated_at": "2024-02-05T23:04:15.000000Z"
}
]
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Project;
class ProjectController extends Controller
{
//
public function index()
{
$projects = Project::all();
return view('project.index', ['projects' => $projects]);
}
}
ou
return view('project.index', compact('projects'));
Dans la vue resources/views/projects/index.blade.php on itère sur les projets:
<h1>Projects</h1>
<ul>
@foreach ($projects as $project)
<li>{{ $project->title }}</li>
@endforeach
</ul>