11 Componente basato su classe
creiamo un nuovo componente da CLI secondo la documentazione laravel
php artisan make:component Alert
viene creata una classe nel file app/View/Components/alert.php che contiene la funzione render() che lancia la nuova vista ubicata in resources/views/components/alert.blade.php
public function render() { return view('components.alert'); }
potremmo anche restituire dell’html anzichè la vista, ma ragioniamo sul file separato, vediamo la view alert.blade.php dove andiamo ad applicare al <div> le classi bootstrap alert, una delle quali dinamicamente e facciamo uscire un messaggio
<div class="alert alert-{{$info}}"> {{$message}} </div>
includere il componente
adesso andiamo ad includere il componente nella nostra pagina (per esempio la home), per includerlo, dobbiamo utilizzare questa sintassi:
<x-alert/>
Quindi un tag HTML <x- /> dopo x- seguirà il nome che abbiamo dato alla classe componente. adesso riceveremo un messaggio di errore che la variabile $info non è definita, per far ciò passiamo il parametro $info come attributo HTML
<x-alert :info="faghy"/>
In questo modo otterremo un errore di costante faghy non è conosciuto, per istruire laravel che si tratta di una stringa dobbiamo avvolgerla anche con i singoli apici
<x-alert :info="'faghy'"/>
adesso abbiamo usato l’attributo info che sarà mappato al corrispondente $info della view alert.blade.php, ma prima dobbiamo dichiararlo insieme anche a $message come proprietà nella classe Alert.php
class Alert extends Component { public $info; public $message;
Per finire dobbiamo passare al costruttore le variabili
public function __construct($info='', $message='') { $this->info = $info; $this->message = $message; }
Dobbiamo tipizzare i parametri oppure assegnare dei valori di default
public function __construct($info='faghy', $message='ciao faghy') { $this->info = $info; $this->message = $message; }
aggiungiamo anche message come attributo
<x-alert :info="'Faghy'" :message="'Ciao Faghy'"/>
Passare parametri in url
Per esempio ipotizziamo di voler passare un parametro name via GET nella URL
http://localhost:8000?name=Fag
Per prima cosa aggiorniamo la rotta web.php, ne approfittiamo per introdurre una novità delle nuove versioni di laravel che se la rotta da restituire è solo una view possiamo scrivere direttamente solo Route::view()
Route::view('/','welcome');
adesso aggiungiamo il parametro name nella view, passandolo come terzo parametro
Route::view('/','welcome',['name' => input('name')]);
nella view welcome invece che mettere un valore fisso al parametro name, richiamiamo la variabile $name
<x-alert :name="$name" :info="'Faghy'" :message="'Hi Faghy'"/>
adesso aggiungiamo alla classe alert e al suo costruttore il parametro name
class Alert extends Component { public $info; public $message; public $name; public function __construct($name='',$info='faghy', $message='ciao faghy') { $this->info = $info; $this->message = $message; $this->name = $name; }
infine nel file alert.blade aggiungiamo la restituzione di $name
<div class="alert alert-{{$info}}"> {{$message}} {{$name}} </div>
adesso siamo pronti ad aprire la nostra URL con il parametro passato.
Se ricevessimo un errore potrebbe di Call to undefined function input() dobbiamo installare il package degli helpers oppure utilizziamo la Facades Request, aggiungiamo la dipendenza
use Illuminate\Support\Facades\Request;
infine utilizziamo Request::input() per il parametro name
Route::view('/','welcome',['name' => Request::input('name')]);
Possiamo includere bootstrap e avere la possibilità di dare al valore info le classi dei contenitori bootstrap, come info, danger….
Aggiungere stile con $attributes
Se per esempio volessimo passare uno stile nella nostra views tipo
<x-alert style="color:red;" :name="$name" :info="'danger'" :message="'Hi Faghy'"/>
ispezionando l’HTML ci accorgeremmo che lo stile non viene passato. Per visualizzarlo dovremmo ricorrere ad una variabile globale di laravel che si chiama $attributes che cattura ogni attributo. Aggiungiamola nel template alert.blade
<div {{$attributes}} class="alert alert-{{$info}}"> {{$message}} {{$name}} </div>
a questo punto lo stile sarà caricato perfettamente.
merge degli attributi
se per esempio aggiungo una classe
<x-alert class="text" style="color:red;" :name="$name" :info="'danger'" :message="'Hi Faghy'"/>
a questo punto verrebbe applicata la classe text perchè catturata dagli attributi. Dobbiamo unire la nuova classe con quelle precedenti effettuando un merge degli attributi
<div {{ $attributes->merge(['class' => 'alert alert-'.$info])}} > {{$message}} {{$name}} </div>
usando $attributes->merge() possiamo unire gli attributi, quindi passiamo alla funzione merge passiamo un array che avrà come primo chiave quello di cui vogliamo fare il merge, quindi la classe
$attributes->merge(['class' =>
e come valore la classe che passavamo prima ma in puro php senza la sintassi blade
$attributes->merge(['class' => 'alert alert-'.$info])
a questo punto avremo le classi unite e l’ HTML ci restituirà
class="alert alert-danger text"