-
Creo database fumetteria in mySQl
-
Mi connetto al DB sul filme .env
-
Creo un controller con lo scaffolding CRUD con php artisan make:controller --resource ComicController
-
Creo un migration per i comics * php artisan make:migration create_comics_table*
-
Definisco la struttura della tabella
-
creo model comic php artisan make:model Comic
-
passo struttura migration a DB php artisan migrate
-
creo seeder per tabella php artisan make:seeder ComicsTableSeeder
-
il seeder al lancio del comando php artisan db:seed --class=ComicsTableSeeder popola dinamicamente il DB con le colonne prendendo le info dal file presente in config comics.php
-
Definisco nel web.app le rotte ai metodi comics presenti nel controller tramite Route::resource...
-
Verifico le rotte create tramite il route:list
- Creo le views-> layout{base} e cartella comics{index-show-create}
- nel controller definisco le logiche per index-> recupero con il model::all() tutto il contenuto della tabella e lo passo alla vista, nella view index ciclo il contenuto passato e stampo la tabella
{ comics/{comic} | comics.show | App\Http\Controllers\ComicController@show }
- Nel metodo controller show passo come argomenti il model e una variabile, sto dicendo di creare una nuova istanza di quell'oggetto/model, a quel punto la funzione ritorna la view e le passa la variabile/nuova istanza.
- nell'index passo al button la route {{ route('comics.show', $comic->id) }}, aggiunta fondamentale il $comic->id;
- Il form si trova nella rotta create, la quale restituisce alla vista utente il form da compilare
- il form deve contenerail token di sicurezza di Laravel @csrf
- in ciascun input del form il name deve essere uguale al nome della colonna cui si riferisce
- il form avrà method="POST" e nella action la route per lo store che verrà fatto all'invio dei campi compilati {{ route('comics.store') }}
- nel metodo controller create dico ddi tornare la vista comics.create
- Come argomenti funzione store del controller scrivo: REQUEST $request, creo una nuova istanza dell'oggetto REQUEST
- salvo in $data, tramite metodo $request->all() un array associativo contenente tutti i dati inseriti nel form
- istanzio nuovo Comic() e lo popolo con elementi presenti in array associativo $data
- per farlo in maniera rapida si può usare il fill, $newComic->fill($data), però devo dichiarare nel model di Comic quali campi sono 'fillable'
- a questo punto chiedo di tornare alla pagina in cui è presente il nuovo fumetto inserito return redirect()->route('comic.show', $newComic->id)
Ci restiuisce una pagine simile a quella del create, con la differenza che il metodo chiamato sarà di PUT, non essendo proprio di HTTP, si lascia nel form il method="POST" e poi si inserisce una funzione di Laravel @method="PUT"
- Argomenti funzione edit controller con injection edit(Comic $comic), ritorna view('comic.edit', compact('comic'))
- Stilizzo index con icona collegamento comic.edit e la pagina in questione
- Inserisco nella pagina comic.edit all'interno del form @method("PUT"), la azione richiama alla route relativa al metodo "comic.update"
- Definisco il metodo update, anche qui aggiungo una injection per istanziare un nuovo oggetto comic
- Usando il metodo validate di request definisco delle validazioni, in seguito salvo i dati del form con la funzione di request->all(), poi con $comic->update(), faccio l'aggiornamento e salvo
- Definisco la rotta di ritorno ad operazione completata
- Nella view di edit imposto i value predefiniti con la funzione old, per evitare che in caso di errore i campi vengano svuotati(faccio la stessa cosa per create-store)
- Se la validazione fallisce viene segnalata all'utente: inserisco il seguente snippet di codice nel laout base:
- [(@if ($errors->any())
-
@foreach ($errors->all() as $error)
- {{ $error }} @endforeach
@endif)]
- Aggiungo le stesse validazione allo store
- Aggiungo il flash data di successo ad entrambi con il metodo ->with e snippet nello show
- Si usa il metodo destroy anche qui al posto di id utilizzo injection
- Uso $comic->delete() come metodo per la cancellazione
- Il pulsante per la gestione della delete essendo un metodo post non può essere un href(che è di GET), sarà dunque un miniform
Bonus -> tramite javascript, quando l’utente clicca sul pulsante “delete”, chiedere conferma della cancellazione, prima di eliminare l’elemento.
Aggiunto onclick="return confirm('Vuoi davvero cancellare il fumetto?')" al form bottone cancellazione