Astuces Laravel
4 min de lecture 430 vues

Laravel Tips Clean Code: Rendez votre code Laravel plus propre et plus sûr #3

mckenziearts

Arthur Monney

@mckenziearts

Laravel Tips Clean Code: Rendez votre code Laravel plus propre et plus sûr #3

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()
{
return "https://www.gravatar.com/avatar/" . md5(strtolower(trim($this->email)));
}
}

✅ Correct

$user->gravatar_url;
 
class User extends Authenticable
{
// ...
 
public function getGravatarUrlAttribute()
{
return "https://www.gravatar.com/avatar/" . md5(strtolower(trim($this->email)));
}
}

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

// Controller
return 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);
mckenziearts

Arthur Monney

@mckenziearts

Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs

Vous aimez cet article ? Faite le savoir en partageant