Aller au contenu principal
Version: 5.x

Contrôleurs

Introduction

Les contrôleurs organisent la logique de gestion des requêtes en classes dédiées, plutôt que de définir des closures dans les fichiers de routes.

Les contrôleurs sont stockés dans app/Controllers/.

Créer un contrôleur

php bow add:controller UserController

Contrôleur simple

app/Controllers/UserController.php
namespace App\Controllers;

use App\Models\User;
use Bow\Http\Request;

class UserController
{
public function index()
{
$users = User::all();

return view('users/index', compact('users'));
}

public function show(Request $request, int $id)
{
$user = User::retrieve($id);

return view('users/show', compact('user'));
}

public function store(Request $request)
{
$user = User::create([
'name' => $request->get('name'),
'email' => $request->get('email'),
]);

return redirect('/users/' . $user->id);
}
}

Définir les routes

routes/app.php
$app->get('/users', 'UserController::index');
$app->get('/users/:id', 'UserController::show');
$app->post('/users', 'UserController::store');

Injection de dépendances

Les dépendances sont automatiquement injectées dans les constructeurs et méthodes :

app/Controllers/OrderController.php
namespace App\Controllers;

use App\Services\PaymentService;
use App\Services\NotificationService;
use Bow\Http\Request;

class OrderController
{
public function __construct(
private PaymentService $paymentService,
private NotificationService $notificationService
) {
}

public function store(Request $request)
{
$order = $this->paymentService->processOrder(
$request->only(['product_id', 'quantity'])
);

$this->notificationService->sendOrderConfirmation($order);

return response()->json($order, 201);
}
}

Contrôleur invocable

Pour les contrôleurs à action unique, utilisez __invoke :

app/Controllers/ShowDashboardController.php
namespace App\Controllers;

use App\Services\DashboardService;
use Bow\Http\Request;

class ShowDashboardController
{
public function __construct(
private DashboardService $dashboard
) {
}

public function __invoke(Request $request)
{
return view('dashboard', [
'stats' => $this->dashboard->getStats(),
]);
}
}
routes/app.php
$app->get('/dashboard', ShowDashboardController::class);

Espaces de noms

Pour les contrôleurs imbriqués, utilisez le chemin relatif :

// Contrôleur: App\Controllers\Admin\UserController
$app->get('/admin/users', 'Admin\UserController::index');

Générer un contrôleur imbriqué :

php bow add:controller Admin/UserController

Middleware

Appliquez des middlewares sur les routes :

$app->get('/profile', 'ProfileController::show')->middleware('auth');

// Plusieurs middlewares
$app->get('/admin', 'AdminController::index')->middleware(['auth', 'admin']);

Contrôleur REST

Les contrôleurs REST facilitent la création d'APIs RESTful.

Générer un contrôleur REST

php bow generate:resource ArticleController

Structure générée

app/Controllers/ArticleController.php
namespace App\Controllers;

use Bow\Http\Request;

class ArticleController
{
/**
* GET /articles
*/
public function index(): void
{
// Liste des articles
}

/**
* POST /articles
*/
public function store(Request $request): void
{
// Créer un article
}

/**
* GET /articles/:id
*/
public function show(Request $request, mixed $id): void
{
// Afficher un article
}

/**
* PUT /articles/:id
*/
public function update(Request $request, mixed $id): void
{
// Mettre à jour un article
}

/**
* DELETE /articles/:id
*/
public function destroy(Request $request, mixed $id): void
{
// Supprimer un article
}
}

Enregistrer les routes REST

routes/app.php
$app->rest('articles', 'ArticleController');

Routes générées

URLMéthodeActionNom
/articlesGETindexarticles.index
/articlesPOSTstorearticles.store
/articles/:idGETshowarticles.show
/articles/:idPUT/PATCHupdatearticles.update
/articles/:idDELETEdestroyarticles.destroy

Contraintes sur les paramètres

// Contrainte globale
$app->rest('articles', 'ArticleController', ['id' => '\d+']);

// Contraintes par méthode
$app->rest('articles', 'ArticleController', [
'show' => ['id' => '\d+'],
'update' => ['id' => '\d+'],
]);

Ignorer des méthodes

$app->rest('articles', [
'controller' => 'ArticleController',
'ignores' => ['destroy'],
], ['id' => '\d+']);

Configuration du namespace

Personnalisez le namespace des contrôleurs dans app/Kernel.php :

app/Kernel.php
public function namespaces(): array
{
return [
'controller' => 'App\\Controllers',
'middleware' => 'App\\Middlewares',
];
}

Il manque quelque chose ?

Si vous rencontrez des problèmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter @bowframework ou sur directement sur le github.