Laravel

MVC

Laravel werkt volgens het model-view-controller concept. Volgens dit concept wordt de opslag van data, het bewerken van data en de presentatie van data gescheiden in de applicatie. In de praktijk blijkt deze opdeling van verantwoordelijkheden te leiden tot applicaties die makkelijk te schalen zijn en code die goed herbruikbaar is.

In Laravel betekent dit onderscheid dat alle database-acties worden ondergebracht in models. De controllers verbinden de data met de javascript, css en html uit de view.

Controllers

Vanaf de command-line in de projectmap kun je een controller aanmaken

php artisan make:controller TestController

Artsisan maakt een TestController.php aan in de map app->Http->Controllers met de volgende code:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
//
}

In de class TestController kunnen we de volgende methode schrijven...

class TestController extends Controller
{
function index() {
return "Hello World";
}
}

Om de index-methode aan te roepen in de testcontroller is er een route nodig in app->routes->web.php

use App\Http\Controllers\TestController;
Route::get('/mytest/', [TestController::class, 'index']);

Models

Een model wordt gebruikt om de communicatie met een gegevensbron zoals bijvoorbeeld database mogelijk te maken. De models van Laravel/Eloquent maken gebruik van PDO (Persisten database object) om queries en data te sturen naar een databaseserver. De connectie heeft gegevens nodig uit het .env-bestand in de projectmap.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mdb
DB_USERNAME=root
DB_PASSWORD=secret

Met php artisan kan een model worden gecreeƫrd. Een model is de classe-presentatie van een tabel. Laravel koppelt een model met de naam 'Movie' automatisch aan de tabel met de naam 'movies'. Laravel maakt de tabelnaam in kleine letters en in meervoud. Dit gaat natuurlijk alleen goed als je de tabellen engelse benamingen geeft. Gelukkig kun je de tabelnaam ook zelf instellen met de eigenschap $table. Laravel gaat er ook van uit dat je tabel een primaire sleutel heeft met de naam 'id'. Dit kun je eventueel ook aanpassen. Als je start met Laravel is het handig om zo veel mogelijk engelse benamingen te gebruiken, zodat je applicatie de naam-conventies van Laravel volgt.

php artisam make:model Movie
class Movie extends Model
{
use HasFactory;
$table = 'movie'
}

In feite is dit al voldoende om gegevens uit een database op te halen en weer te geven. De TestController aangepast met een nieuwe methode 'getMovies' in app->http->controllers->TestController.php Er wordt een nieuwe route gedefineerd (in routes->web.php) die gebruik maakt van de nieuwe methode in de TestController. )

//In web.php
Route::get('/movies/', [TestController::class, 'getMovies']);

//In TestController.php
class TestController extends Controller
{
function index() {
return "Hello World";
}

function getMovies() {
return Movie::all();
}
}

Het resultaat is een lijst met alle movies in de tabel movie!

Views

In deze tutorial wordt de applicatie verder uitgewerkt in VueJS en zodoende wordt er vrijwel geen gebruik gemaakt van Views in Laravel. Laravel dient dan als API voor een VueJS-front-end.

Om het resultaat toch weer te geven in een view wordt hier een voorbeeld gegeven:
Views worden opgeslagen in resources->views. Laravel maakt standaard gebruik van de template-engine 'Blade'. Blade-bestanden eindigen altijd op blade.php. Voor het movie-overzicht wordt het bestand movies.blade.php in de views-map aangemaakt. Een blade-template bestaat uit html waarbinnen variabelen en zgn. blade-directives gebruikt kunnen worden om door php/laravel gegenereerde data weer te geven. Om de movies weer te geven kun je de volgende code gebruiken....

<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Laravel</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Nunito', sans-serif;
}
</style>
</head>
<body>
<table>
<tr>
<th>Number</th>
<th>Title</th>
<th>Year</th>
</tr>
@foreach ($movies as $movie)
<tr>
<td>{{ $movie->movie_id }}</td>
<td>{{ $movie->title }}</td>
<td>{{ $movie->year }}</td>
</tr>
@endforeach
</table>
</body>
</html>

De variabelen herken je aan de {{ ... }} structuur. Binnen de accolades kun je php code gebruiken. Daarnaast zie je de for-each loop die bestaat uit blade-directives (@foreach .... @endforeach).