Skip to content
Snippets Groups Projects
Commit 87f05102 authored by Gabriel Frey's avatar Gabriel Frey
Browse files

Ajout du TP9

parent 34ff0357
Branches
No related merge requests found
Showing
with 701 additions and 0 deletions
TP9 - Prise en main de Laravel
==============================
Objectifs
---------
Comprendre l'utilisation du framework Laravel.
Nous souhaitons mettre en place une application fonctionnelle **qui respecte le découpage MVC**.
Exercice 1 : Installation
-------------------------
Suivez les indications données dans [LARAVEL-installation.md](LARAVEL-Installation.md).
Exercice 2 : Création dune vue et de la route associée
---------------------------------
1. Dans `resources/views/`, ajouter une vue :
- `fichierHTML.php`
1. Dans `routes/web.php` :
- Écrivez la routes GET `page1` renvoyant la vue `fichierHTML.php`.
Exercice 3 : BDD
----------------------------------
1. Créer un fichier `.env` s'il n'existe pas en copiant le fichier `.env.example`.
1. Consultez le fichier `.env` pour y trouver où est indiquer le SGBD et la base de données utilisée.
Exercice 4 : Contrôleur
----------------------------------------------
À l'aide d'`artisan`, créez une contrôleur `UserController` (`php artisan make:controller UserController`).
1. Créez une méthode `afficherPage` dans le contrôleur.
1. Ecrire le code de la méthode `afficherPage` de sorte à ce qu'elle renvoie juste la page définie dans l'exercice 3 (`return view ("fichierHTML");`)
1. Modifiez le routeur `page1` de sorte à ce qu'elle utilise le contrôleur.
Exercice 5 : Site complet d'authentification
----------------------------------------------
1. Utiliser et comprenez l'application Laravel d'authentification contenu dans le répertoire authentification :
1. Inspectez le fichier de routage `routes/web.php` pour voir les différentes routes de l'application.
2. Inspecter le répertoire `ressources/views` pour voir les différentes vues de l'applications. Les vues sont au format `blade` et ils utilisent un `layout` de base définie dans `resources/views/layouts/mainLayout.blade.php`.
3. Inspectez le répertoire `app/Models` pour voir le différents modèle utilisé par l'application. Le model est présent dans une version détaillée (`MyUser_old.php`) et dans une version gérée par l'ORM `Eloquent`.
4. Inspectez le répertoire `app/Http/Controllers` pour voir les contrôleurs utilisées par l'application.
\ No newline at end of file
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_size = 4
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_TIMEZONE=UTC
APP_URL=http://localhost
APP_LOCALE=en
APP_FALLBACK_LOCALE=en
APP_FAKER_LOCALE=en_US
APP_MAINTENANCE_DRIVER=file
# APP_MAINTENANCE_STORE=database
PHP_CLI_SERVER_WORKERS=4
BCRYPT_ROUNDS=12
LOG_CHANNEL=stack
LOG_STACK=single
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=sqlite
DB_DATABASE=/home/gabriel/TestCode/laravel/application_authentification/database/CAWEBI.db
DB_FOREIGN_KEYS=true
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
SESSION_DRIVER=database
SESSION_LIFETIME=120
SESSION_ENCRYPT=false
SESSION_PATH=/
SESSION_DOMAIN=null
BROADCAST_CONNECTION=log
FILESYSTEM_DISK=local
QUEUE_CONNECTION=database
CACHE_STORE=database
CACHE_PREFIX=
MEMCACHED_HOST=127.0.0.1
REDIS_CLIENT=phpredis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=log
MAIL_HOST=127.0.0.1
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
AWS_USE_PATH_STYLE_ENDPOINT=false
VITE_APP_NAME="${APP_NAME}"
* text=auto eol=lf
*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php
/.github export-ignore
CHANGELOG.md export-ignore
.styleci.yml export-ignore
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor
.env
.env.backup
.env.production
.phpactor.json
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode
/.zed
<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>
<p align="center">
<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>
<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>
</p>
## About Laravel
Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:
- [Simple, fast routing engine](https://laravel.com/docs/routing).
- [Powerful dependency injection container](https://laravel.com/docs/container).
- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.
- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).
- Database agnostic [schema migrations](https://laravel.com/docs/migrations).
- [Robust background job processing](https://laravel.com/docs/queues).
- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).
Laravel is accessible, powerful, and provides tools required for large, robust applications.
## Learning Laravel
Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.
You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.
If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains thousands of video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.
## Laravel Sponsors
We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the [Laravel Partners program](https://partners.laravel.com).
### Premium Partners
- **[Vehikl](https://vehikl.com/)**
- **[Tighten Co.](https://tighten.co)**
- **[WebReinvent](https://webreinvent.com/)**
- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**
- **[64 Robots](https://64robots.com)**
- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**
- **[Cyber-Duck](https://cyber-duck.co.uk)**
- **[DevSquad](https://devsquad.com/hire-laravel-developers)**
- **[Jump24](https://jump24.co.uk)**
- **[Redberry](https://redberry.international/laravel/)**
- **[Active Logic](https://activelogic.com)**
- **[byte5](https://byte5.de)**
- **[OP.GG](https://op.gg)**
## Contributing
Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).
## Code of Conduct
In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).
## Security Vulnerabilities
If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.
## License
The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Memo;
class MemoController extends Controller
{
public function add( Request $request ) {
// A completer
return to_route('view_account')->with('message',"New memo added.");
}
public function show( Request $request ) {
// A completer
return view('memolist',['memos'=> []]);
}
}
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\MyUser;
class UserController extends Controller
{
/**************************************************************************
* Connect a user with login and password.
*/
public function connect(Request $request) {
if ( !$request->filled(['login','password']) )
return to_route('view_signin')->with('message',"Some POST data are missing.");
$user = MyUser::where( 'login', $request->login )->first();
if ( !$user || !password_verify($request->password,$user->password) )
return to_route('view_signin')->with('message','Wrong login/password.');
$request->session()->put('user',$user);
return to_route('view_account');
}
/**************************************************************************
* Create a new user.
*/
public function create(Request $request) {
if ( !$request->filled(['login','password','confirm']) )
return to_route('view_signup')->with('message',"Some POST data are missing.");
if ( $request->password !== $request->confirm )
return to_route('view_signup')->with('message',"The two passwords differ.");
$user = new MyUser;
$user->login = $request->login;
$user->password = password_hash($request->password,PASSWORD_DEFAULT);
try {
$user->save();
}
catch (\Exception $e) {
return to_route('view_signup')->with('message',$e->getMessage());
}
return to_route('view_signin')->with('message',"Account created! Now, signin.");
}
/**************************************************************************
* Update the password of the connected user.
*/
public function updatePassword(Request $request) {
if ( !$request->user )
return to_route('view_signin');
if ( !$request->filled(['newpassword','confirmpassword']) )
return to_route('view_formpassword')->with('message',"Some POST data are missing.");
if ( $request->newpassword != $request->confirmpassword )
return to_route('view_formpassword')->with('message',"Error: passwords are different.");
$request->user->password = password_hash($request->newpassword,PASSWORD_DEFAULT);;
try {
$request->user->save();
}
catch (\Exception $e) {
return to_route('view_formpassword')->with('message',$e->getMessage());
}
return to_route('view_account')->with('message',"Password successfully updated.");
}
/**************************************************************************
* Delete the connected user.
*/
public function delete(Request $request) {
if ( !$request->user )
return to_route('view_signin');
try {
$request->user->delete();
}
catch (\Exception $e) {
return to_route('view_account')->with('message',$e->getMessage());
}
$request->session()->flush();
return to_route('view_signin')->with('message',"Account successfully deleted.");
}
/**************************************************************************
* Disconnect the connected user.
*/
public function disconnect(Request $request) {
$request->session()->flush();
return to_route('view_signin');
}
}
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class AuthenticateMyUser
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if ( $request->session()->missing('user') )
return to_route('view_signin');
$request->user = $request->session()->get('user');
return $next($request);
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Memo extends Model
{
use HasFactory;
public $timestamps = false;
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class MyUser extends Model {
public $timestamps = false;
protected $table = 'myusers';
protected $primaryKey = 'login';
protected $keyType = 'string';
public function memos(): HasMany
{
return $this->hasMany(Memo::class,'owner');
}
}
<?php
namespace App\Models;
use Illuminate\Support\Facades\DB;
use PDO;
class MyUser
{
private string $_login;
private ?string $_password;
private const USER_TABLE = "myusers";
public function __construct( string $login, string $password = null )
{
$this->setLogin($login);
$this->setPassword($password);
}
public function login() : string
{
return $this->_login;
}
public function setLogin( string $login ) : void
{
$this->_login = $login;
}
public function password() : string
{
return $this->_password;
}
public function setPassword( ?string $password ) : void
{
$this->_password = $password;
}
public function exists() : bool
{
// 1. On prépare la requête $request
$request = DB::connection()->getPdo()->prepare('SELECT password FROM '.self::USER_TABLE.' WHERE login = :login');
// 2. On assigne $login au paramêtre :login
$ok = $request->bindValue( ":login", $this->_login, PDO::PARAM_STR );
// 3. On exécute la requête $request
$ok &= $request->execute();
if (!$ok)
throw new Exception("Error: user access in DB failed.");
// 4. On vérifie que l'utilisateur a été trouvé et que son mot de passe
// correspond à celui de l'attribut $this->_password
$user = $request->fetch(PDO::FETCH_ASSOC);
return $user && password_verify($this->_password,$user['password']);
}
public function create() : void
{
$request = DB::connection()->getPdo()->prepare('INSERT INTO '.self::USER_TABLE.'(login,password) VALUES (:login,:password)');
$ok = $request->bindValue( ":login", $this->_login, PDO::PARAM_STR );
$ok &= $request->bindValue( ":password", password_hash($this->_password,PASSWORD_DEFAULT), PDO::PARAM_STR );
$ok &= $request->execute();
if ( !$ok )
throw new Exception("Error: user creation in DB failed.");
}
public function changePassword( string $newpassword ) : void
{
$request = DB::connection()->getPdo()->prepare('UPDATE '.self::USER_TABLE.' SET password = :password WHERE login = :login');
$ok = $request->bindValue(':login', $this->_login, PDO::PARAM_STR);
$ok &= $request->bindValue(':password', password_hash($newpassword,PASSWORD_DEFAULT), PDO::PARAM_STR);
$ok &= $request->execute();
if ( !$ok )
throw new Exception("Error: password updating failed.");
$this->setPassword($newpassword);
}
public function delete() : void
{
$request = DB::connection()->getPdo()->prepare('DELETE FROM '.self::USER_TABLE.' WHERE login = :login');
$ok = $request->bindValue(':login', $this->_login, PDO::PARAM_STR);
$ok &= $request->execute();
if ( !$ok )
throw new Exception("Error while deleting your account.");
}
}
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
//
}
}
#!/usr/bin/env php
<?php
use Symfony\Component\Console\Input\ArgvInput;
define('LARAVEL_START', microtime(true));
// Register the Composer autoloader...
require __DIR__.'/vendor/autoload.php';
// Bootstrap Laravel and handle the command...
$status = (require_once __DIR__.'/bootstrap/app.php')
->handleCommand(new ArgvInput);
exit($status);
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
*
!.gitignore
<?php
return [
App\Providers\AppServiceProvider::class,
];
{
"name": "laravel/laravel",
"type": "project",
"description": "The skeleton application for the Laravel framework.",
"keywords": ["laravel", "framework"],
"license": "MIT",
"require": {
"php": "^8.2",
"laravel/framework": "^11.9",
"laravel/tinker": "^2.9"
},
"require-dev": {
"fakerphp/faker": "^1.23",
"laravel/pail": "^1.1",
"laravel/pint": "^1.13",
"laravel/sail": "^1.26",
"mockery/mockery": "^1.6",
"nunomaduro/collision": "^8.1",
"phpunit/phpunit": "^11.0.1"
},
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover --ansi"
],
"post-update-cmd": [
"@php artisan vendor:publish --tag=laravel-assets --ansi --force"
],
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi",
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
"@php artisan migrate --graceful --ansi"
],
"dev": [
"Composer\\Config::disableProcessTimeout",
"npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite"
]
},
"extra": {
"laravel": {
"dont-discover": []
}
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true,
"allow-plugins": {
"pestphp/pest-plugin": true,
"php-http/discovery": true
}
},
"minimum-stability": "stable",
"prefer-stable": true
}
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment