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
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
$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 :
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 :
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(),
]);
}
}
$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
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
$app->rest('articles', 'ArticleController');
Routes générées
| URL | Méthode | Action | Nom |
|---|---|---|---|
/articles | GET | index | articles.index |
/articles | POST | store | articles.store |
/articles/:id | GET | show | articles.show |
/articles/:id | PUT/PATCH | update | articles.update |
/articles/:id | DELETE | destroy | articles.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 :
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.