Laravel Tips Clean Code: Rendez votre code Laravel plus propre et plus sûr #3
Arthur Monney
@mckenziearts
Nous sommes maintenant à notre 3e série de Laravel Tips Clean Code pour mieux écrire notre code Laravel, le rendre plus optimal, lisible et facile à comprendre. Les 2 premières séries sont disponible ici
Les méthodes du modèle ne doivent pas être utilisées pour récupérer des données.
Si vous voulez récupérer des données à partir d'un modèle, créez un accesseur. Gardez des méthodes pour les choses qui modifient le modèle d'une manière ou d'une autre.
❌ Mauvais
$user->gravatarUrl(); class User extends Authenticable{ // ... public function gravatarUrl() { }}
✅ Correct
$user->gravatar_url; class User extends Authenticable{ // ... public function getGravatarUrlAttribute() { }}
Utiliser des fichiers de configuration personnalisés
Vous pouvez stocker des éléments comme "résultats par page" dans des fichiers de configuration. Mais ne les ajoutez pas au fichier de configuration de l'application app
. Créez le vôtre. Dans le projet de Laravel Cameroun, j'utilise config/lcm.php
.
return [ 'ads' => [ [ 'image' => 'notify', 'alt' => 'Laravel Notify', 'description' => 'Découvrez la nouvelle version de Laravel Notify pour vos projets Laravel.', ], ], ];
N'utilisez pas les namespace pour le contrôleur
Au lieu d'écrire des actions de contrôleur comme PostController@index
, utilisez la syntaxe de tableau appelable [PostController::class, 'index']
. Vous pourrez naviguer vers la classe en cliquant sur PostController
.
❌ Mauvais
Route::get('/posts', 'PostController@index');
✅ Correct
Route::get('/posts', [PostController::class, 'index']);
Considérer les contrôleurs à action unique
Si vous avez une action complexe, envisagez de la déplacer vers un contrôleur distinct. Pour OrderController::create
il faudrait créer CreateOrderController
Une autre solution consiste à déplacer cette logique vers une classe d'action - faites ce qui vous convient le mieux dans votre cas.
// Nous utilisons la syntaxe de classe de l'astuce ci-dessus.Route::post('/orders/', CreateOrderController::class); class CreateOrderController{ public function __invoke(Request $request) { // ... }}
Soyez amis avec votre IDE
Installez des extensions, écrivez des annotations, utilisez des typeshints. Votre IDE vous aidera à faire fonctionner votre code correctement, ce qui vous permettra de consacrer plus d'énergie à l'écriture d'un code qui soit également lisible.
$products = Product::with('options')->cursor(); foreach ($products as $product) { /** @var Product $product */ if ($product->options->isEmpty()) {}} /////////////////////////// foreach (Order::whereDoesntHave('invoice')->whereIn('id', $orders->pluck('id'))->get() as $order) { /** @var Order $order */ $order->createInvoice();}
Utiliser des short operators
PHP possède de nombreux opérateurs qui peuvent remplacer les vilaines vérifications if. Apprenez-les par cœur.
// truthy test // ❌ // ✅if (! $foo) { $foo = $foo ?: 'bar' $foo = 'bar';} // null test // ❌ // ✅if (is_null($foo)) { $foo = $foo ?? 'bar'; $foo = 'bar'; // ✅ PHP 7.4} $foo ??= 'bar';
Utilisez des helpers à la place des façades
C'est en grande partie une question de préférence personnelle, mais le fait d'appeler une fonction globale au lieu de devoir importer une classe et d'appeler statiquement une méthode me semble plus agréable.
Des points bonus pour la syntaxe session('key').
// ❌Cache::get('foo'); // ✅cache()->get('foo'); // 😍cache('foo');
Créer des directives blade personnalisées pour la logique metier
Vous pouvez rendre vos modèles Blade plus expressifs en créant des directives personnalisées. Par exemple, plutôt que de vérifier si l'utilisateur a le rôle d'administrateur, vous pouvez utiliser @admin.
❌ Mauvais
@if(auth()->user()->hasRole('admin')) // ...@else // ...@endif
✅ Correct
@admin // ...@else // ...@endadmin
Évitez autant que possible les requêtes dans Blade
Il peut arriver que vous souhaitiez exécuter des requêtes DB dans blade. Il y a quelques cas d'utilisation corrects pour cela, comme dans les fichiers de mise en page.
Mais s'il s'agit d'une vue renvoyée par un contrôleur, passez plutôt les données dans les données de la vue.
❌ Mauvais
@foreach(Product::where('enabled', false)->get() as $product) // ...@endforeach
✅ Correct
// Controllerreturn view('foo', [ 'disabledProducts' => Product::where('enabled', false)->get(),]); // View@foreach($disabledProducts as $product) // ...@endforeach
Utiliser la comparaison stricte
Utilisez TOUJOURS la comparaison stricte (=== et !==). Si nécessaire, mettez les choses dans le bon type avant de les comparer. C'est mieux que les résultats non sécurisés de ==
Pensez également à activer les types stricts dans votre code. Cela évitera de passer des variables de mauvais types de données aux fonctions.
// ❌$foo == 'bar'; // ✅$foo === 'bar'; // 💪declare(strict_types=1);
Arthur Monney
@mckenziearts
Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs