Accesso alla pagina privata
Manteniamo lo stesso pattern di sviluppo utilizzato per il capitolo precedente e occupiamoci ora delle rotte:
Route::group(['middleware' => 'auth'], function () {
Route::get('/my-page', [
'uses' => 'FrontendController@getPrivatePage',
'as' => 'private-page'
]);
Route::get('/my-page/{bookId}', [
'uses' => 'FrontendController@addFavouriteBook',
'as' => 'favourite-book'
]);
});
Dedichiamoci quindi ai due nuovi metodi nel FrontendController
:
public function getPrivatePage()
{
return View::make('private');
}
public function addFavouriteBook($bookId)
{
Auth::user()->books()->attach(Book::findOrFail($bookId));
return redirect(route('private-page'));
}
Il primo metodo (getPrivatePage
) non fa altro che mostrare una view dedicata, mentre il secondo metodo si occupa di ottenere l'oggetto Book
dal database e di associarlo all'elenco dei libri preferiti dall'utente corrente.
Nelle view dobbiamo implementare due aspetti. Il primo è la creazione della pagina privata:
<div class="row">
<div class="col-md-6">
@include('shared.lastBook')
</div>
<div class="col-md-6">
<h3>I miei libri preferiti</h3>
<ul>
@foreach(Auth::user()->books as $book)
<li>{{ $book->title }} ({{ $book->pivot->created_at }})</li>
@endforeach
</ul>
</div>
</div>
Il secondo è la modifica del view composer lastBook
per mostrare un link dedicato all'aggiunta del libro tra i preferiti:
<ul>
@foreach($lastBookList as $book)
<li>
{{ $book->title }}
@if(Auth::check())
<a href="{{ route('favourite-book', [ 'bookId' => $book->id ]) }}">
Aggiungi
</a>
@endif
</li>
@endforeach
</ul>
In questo caso, se tutto è stato implementato correttamente, potremmo aggiungere dei libri tra i preferiti. Ulteriori implementazioni potrebbero essere quelle di evitare l'inserimento di "doppioni" e implementare l'operazione inversa, ovvero l'eliminazione di un libro dai preferiti.
Amministratori e anagrafica contenuti
L'ultima specifica che manca è quella di negare l'accesso alle pagine di anagrafica per gli utenti non amministratori. A livello di configurazione di modelli abbiamo già svolto il lavoro aggiungendo una nuova colonna nel database. L'operazione rimanente è a livello di configurazione di rotte, per aggiungere un middleware dedicato a questo controllo personalizzato per le rotte del backoffice.
Creiamo quindi un nuovo middleware con il comando:
php artisan make:middleware Admin
e aggiungiamolo all'interno di app/Http/Kernel.php
tra i middleware registrati.
Implementiamo quindi la sua logica basandoci sul middleware Authenticate
già presente:
public function handle($request, Closure $next)
{
if (!$this->auth->user()->admin) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('login');
}
}
return $next($request);
}
Come ultima operazione modifichiamo il file delle rotte, incapsulando le rotte di anagrafica in un nuovo gruppo dedicato a questo controllo:
Route::group(['middleware' => 'admin'], function () {
Route::resource('author', 'AuthorController');
Route::resource('book', 'BookController');
});
Se tutto è stato implementato correttamente, ora solo gli utenti amministratori potranno accedere alle rotte /author
e /book
.