Clean Code: 5 funzionalità di Laravel che renderanno il tuo codice compatto e pulito
Laravel offre molte funzionalità per aiutarti a scrivere clean code e codice compatto.
In questo articolo, ti mostrerò 5 funzionalità di Laravel che renderanno il tuo codice più compatto.
4 minuti
Sei sempre alla ricerca di modalità e funzionalità per scrivere clean code. Hai sentito parlare di alcune funzionalità, e ora vuoi approfondire come l’utilizzo.
Sei capitato nel posto giusto al momento giusto: di seguito, infatti, ti descriverò cinque funzionalità eccezionali che renderanno il tuo codice più compatto.
Dunque, cosa ne pensi di metterti subito in azione? Siediti comodo, ritagliati qualche minuto di tempo per te e leggi tutto quanto ho da dirti: sono sicuro che, al termine della guida, sarai perfettamente in grado di utilizzarle. Detto ciò, non mi resta che augurarti buona lettura e buon lavoro!
Il Metodo tap()
Supponiamo di avere la necessità di creare un metodo per aggiungere nuove informazioni visive, nuove immagini in un database. Infine il metodo deve restituire il modello che i dati nuovi caricati. Per caricare queste informazioni possiamo utilizzare i metodi update() e save() di Eloquent, che però restituiscono un valore booleano e non restituiscono il modello corrente. Per implementare una funzionalità di questo tipo, e restituire il modello, dovremmo scrivere codice come segue:
<?php
use App\Models\Image;
public function addImage(): Image
{
$photo = new Image();
$photo->name = 'ImageOne';
$photo->path = '/path/to/image';
$photo->save();
return $image;
}
public function updateImage($id, $data): Image
{
$images = Image::find($id);
$test = $images->update($data);
return $images;
}
Vediamo ora su questo esempio come fare per rendere il codice più compatto e pulito, utilizzando la funzione tap() dell’helper.
use App\Models\Image;
public function addImage(): Photo
{
return tap(new Image(), function ($instance) {
$instance->name = 'ImageOne'; // $instance is a Image model
$instance->path = '/path/to/image';
$instance->save();
});
}
public function updateImage($id, $data): Image
{
return tap(Image::find($id))->update($data);
};
In entrambi le funzioni, inserimento e modifica, viene passato come parametro il modello Image su cui lavorare. Nel primo caso viene specificata anche la function per specificare le informazioni di inserimento.
Nel secondo caso la modifica viene implementata mediante update().
Clausola condizionale. Metodo when()
Immagina di ricevere un campo facoltativo dall’utente. Se questo campo esiste e il suo valore è true (non un confronto rigoroso), allora nel database dovremmo cercare i record in base al loro valore. Nell’esempio successivo il parametro booleano è rappresentato dalla variabile $role. Senza usare il metodo when(), il nostro codice apparirebbe così.
$role = $request->input('role');
$images = Image::where('path', 'path/to/file');
// We have to test with if condition
//
if($role) {
$images->where('role_id', $role);
}
dump($images->get());
Il codice sopra può essere reso più pulito utilizzando il metodo when(). La funzione anonima che viene passata al metodo when() verrà eseguita solo quando il valore di $role è true. La funzione when() viene invocata dopo la where() di Eloquent, con primo parametro il booleano e come secondo parametro la funzione da invocare se il booleano è vero.
$images = Image::where('path', 'path/to/file')
->when($role, function ($query, $role) {
$query->where('role_id', $role);
})
->get();
dump($images);
Number::abbreviate()
Il metodo abbreviate() dell’helper Number è utile quando c’è la necessità di inviare un numero al front end mediante blade, in un formato leggibile. Vediamo un esempio con due casi di visualizzazione di numeri, specificando anche il formato di visualizzazione. Come nel secondo caso con una precisione di due cifre decimali.
Output: 500K
<span class="count">
{{ Number::abbreviate(500000) }}
</span>
You can also set the precision
Output: 525.68K
<span class="count">
{{ Number::abbreviate(525678, precision: 2) }}
</span>
funzione abort_if()
Supponiamo di essere in una situazione in cui dobbiamo generare eccezioni, e che la generazione della dipendere da una specifica condizione. Questo può essere fatto in questo modo, cioè verificando appunto una cerca condizione, o il contenuto di una specifica variabile.
$forbidden = true; // Some variable
if($forbidden) {
abort(403, 'You don\'t have access');
}
In alternativa, possiamo utilizzare la funzione abort_if(), che prevede anche (come primo parametro) la verifica di una specifica condizione. Se questa condizione è verificata con true, allora la funzione genererà un’eccezione solo quando il valore del primo argomento è true.
$forbidden = true;
abort_if($forbidden, 403, 'You don\'t have access');
Arr::toCssClasses()
Nel caso in cui avessimo la necessità di aggiungere classi a un elemento HTML, in un blade in base ad alcune condizioni. Senza il metodo Arr::toCssClasses(), saremmo costretti a usare diverse istruzioni condizionali, e quindi ne perderemmo in leggibilità e ordine.
Guardando l’esempio successivo, con le variabili di stato impostate come segue: $status è true e $error è false, avremo come output le classi result e active.
@php
// Some variables
$status = true;
$error = false;
@endphp
<div class="result @if($status) active @endif @if($error) error @endif">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor...
</div>
Modificando l’esempio con il metodo Arr::toCssClasses, saranno visualizzate solo se $status è true. Guardate come il codice diventa più leggibile, generando comunque classi da un array in base alle codizioni.
@php
$status = true;
$error = false;
// Array with classes
$classes = ['result', 'active' => $status, 'error' => $error];
@endphp
<div class="{{ Arr::toCssClasses($classes) }}">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor...
</div>
Se utilizzassimo la direttiva Blade @class, ovviamente solo se si utilizza questa funzionalità in Blade. Il codice dell’esempio diventa come segue:
<div @class([
'result',
'active' => $status,
'error' => $error
])>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor...
</div>