() translation by (you can also view the original English article)
In questo articolo, daremo un'occhiata alle nuove caratteristiche di Laravel 5.2 e le descriveremo una per una. Le nuove funzionalità sono elencate di seguito:
- route model binding implicito
- convalida di form come array
- API rate-limiting middleware
- middleware groups
- autenticazione automatica
- driver di autenticazione multipli
Driver di autenticazione multipli
Questa funzione vi aiuterà soprattutto quando dovrete usare Doctrine ORM Auth con più provider. Nei miei progetti preferisco avere l'autenticazione utente e admin separata da altro; questa caratteristica mi aiuterà a raggiungere questo obiettivo facilmente. Vediamo un esempio config/auth.php
:
1 |
//...
|
2 |
'guards' => [ |
3 |
'user' => [ |
4 |
'driver' => 'session', |
5 |
'provider' => 'users', |
6 |
],
|
7 |
'admin' => [ |
8 |
'driver' => 'session', |
9 |
'provider' => 'admin', |
10 |
],
|
11 |
|
12 |
'api' => [ |
13 |
'driver' => 'token', |
14 |
'provider' => 'users', |
15 |
],
|
16 |
],
|
17 |
//...
|
18 |
'providers' => [ |
19 |
'users' => [ |
20 |
'driver' => 'doctrine', |
21 |
'model' => App\Entities\Users::class, |
22 |
],
|
23 |
'admin' => [ |
24 |
'driver' => 'doctrine', |
25 |
'model' => App\Entities\Admin::class, |
26 |
],
|
27 |
],
|
Ora, quando si utilizza Auth::attempt([...])
, Laravel chiamerà la protezione predefinita; invece se si desidera utilizzare una protezione specifica, basta chiamarla con il suo nome, ad esempio Auth::guard('admin')
.
Per l'autenticazione sulla route con una protezione specifica, è possibile chiamare semplicemente il nome:
1 |
Route::group(['middleware' =>['auth:admin']], function () { |
2 |
//...
|
3 |
}
|
A volte, piuttosto che un semplice login nella tua app, si può richiedere che gli utenti aggiungano un api_token
alla fine della loro stringa di query e utilizzarla per autenticare la loro richiesta. TokenGuard vi permetterà di raggiungere questo obiettivo facilmente.
Se si desidera utilizzare l'autenticazione con token, prima di tutto è necessario aggiungere un campo api_token
univoco di 60 caratteri nella tabella del database del modello selezionato (entity in doctrine). Ora è possibile utilizzare facilmente un api
guard nella tua app.
Route model binding implicito
Una delle nuove funzionalità di 5.2 Laravel davvero molto pratica è l'associazione del modello alla route. È possibile associare il modello al percorso; prima bisognava crearlo manualmente:
1 |
Route::get('user/{id}', function ($id) { |
2 |
$user = Users::findOrFail($id); |
3 |
// ...
|
4 |
});
|
O si può fare qualcosa di simile:
1 |
//...
|
2 |
$router->model('user', 'App\User'); |
3 |
//...
|
4 |
|
5 |
$router->get('profile/{user}', function(App\User $user) { |
6 |
//
|
7 |
});
|
Laravel 5.2 rende tutto ancora più facile. Basta passare un parametro nella closure della route, e verrà automaticamente verrà trattata come un'associazione di modello al percorso:
1 |
Route::get('user/{id}', function (App\User $user) { |
2 |
//...
|
3 |
});
|
Ora è più semplice associare il modello al tuo percorso.
Per impostazione predefinita, Laravel utilizza la colonna id del modello. Ma se ci si aspetta di cambiare la mappatura, puoi cambiare il tuo modello in questo modo:
1 |
class User extends Model |
2 |
{
|
3 |
public function getRouteKeyName() |
4 |
{
|
5 |
return 'UserEmail'; |
6 |
}
|
7 |
}
|
Eloquent implementa Illuminate\Contracts\Routing\UrlRoutable
, in questo modo puoi sovrascrivere il metodo getKeyRouteName()
. Definisce quale colonna deve essere utilizzata per cercarlo da un URL.
Middleware groups
Come potete vedere nella sezione precedente, abbiamo creato una guardia diversa per utente e amministratore. In questo caso, se si desidera assegnare un middleware a un gruppo di route per l'utente o ad un gruppo di route per l'area admin, Laravel 5.2 consente di creare un collegamento con un nome chiave.
Per definire il gruppo di middleware, è necessario modificare il kernel.php nella cartella https:
1 |
protected $middlewareGroups = [ |
2 |
//...
|
3 |
'admin' => [ |
4 |
'acl', |
5 |
'web', |
6 |
'auth', |
7 |
]
|
8 |
];
|
E ora è possibile utilizzarlo facilmente nel tuo gruppo di route.
Middleware per rate-limiting delle api
Se utilizzi le API di un'altra applicazione come GitHub, utilizzando l'autenticazione di base o OAuth per le richieste, si possono fare fino a 5.000 richieste all'ora. Questa limitazione è chiamata rate limiting. Se si desidera avere qualcosa di simile nella tua app, si può utilizzare la nuova funzionalità di Laravel 5.2. Laravel 5.2 ha aggiunto un nuovo throttle
middleware che gestirà la limitazione delle richieste. Ad esempio, potrebbe essere qualcosa di simile:
1 |
Route::group(['prefix' => 'api', 'middleware' => 'throttle'], function () { |
2 |
Route::get('user', function () { |
3 |
return Users::all(); |
4 |
});
|
5 |
});
|
Per impostazione predefinita, il middleware throttle
consente 60 tentativi al minuto in kernel.php
:
1 |
//...
|
2 |
'api' => [ |
3 |
'throttle:60,1', |
4 |
'auth:api', |
5 |
],
|
È possibile modificarlo come si vuole o anche personalizzarlo per un percorso specifico:
1 |
Route::group(['prefix' => 'api', 'middleware' => 'throttle:10,1000'], function () { |
2 |
Route::get('user', function () { |
3 |
return Users::all(); |
4 |
});
|
5 |
});
|
Implementare l'autenticazione
Laravel 5.2 fornisce un modo rapido per preimpostare tutto il necessario per l'autenticazione utilizzando questo comando:
1 |
php artisan make:auth |
Utilizzando questo comando in una nuova applicazione si otterranno view di registrazione e di accesso, nonché percorsi per tutte le autenticazioni. Il mio file di route assomiglia a questo:
1 |
Route::group(['middleware' => 'web'], function () { |
2 |
Route::auth(); |
3 |
Route::get('/home', 'HomeController@index'); |
4 |
});
|
Il metodo Route:: auth()
è una scorciatoia per definire i seguenti percorsi(route):
1 |
// Authentication Routes...
|
2 |
$this->get('login', 'Auth\AuthController@showLoginForm'); |
3 |
$this->post('login', 'Auth\AuthController@login'); |
4 |
$this->get('logout', 'Auth\AuthController@logout'); |
5 |
|
6 |
// Registration Routes...
|
7 |
$this->get('register', 'Auth\AuthController@showRegistrationForm'); |
8 |
$this->post('register', 'Auth\AuthController@register'); |
9 |
|
10 |
// Password Reset Routes...
|
11 |
$this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm'); |
12 |
$this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail'); |
13 |
$this->post('password/reset', 'Auth\PasswordController@reset'); |
Sarà generato anche un controller HomeController
, che sarà responsabile delle richieste di login alla dashboard della tua applicazione. Ma è possibile personalizzare o rimuovere questo controller in base alle esigenze dell'applicazione.
Validazione di form array
Un altro aspetto importante con cui ho lavorato sono i form array in HTML. Se inserisci una stringa tra le parentesi quadre allora il risultato sarà un array associativo, altrimenti sarà un array numerico:
1 |
<form action="" method="POST"> |
2 |
<input type="text" name="name[first]"> |
3 |
<input type="text" name="name[last]"> |
4 |
<input type="submit"> |
5 |
</form>
|
Il risultato, usando print_r($_POST)
sarà:
1 |
array( |
2 |
'name' => array( |
3 |
'first' => '' |
4 |
'last' => '' |
5 |
)
|
6 |
)
|
Questo ti semplificherà molto il lavoro di validazione di un form. Ora vediamo la convalida dei nostri campi utente in Laravel 5.2:
1 |
public function Validator() |
2 |
{
|
3 |
$this->validate(Request::all(), [ |
4 |
'name.*.first' => 'required|string', |
5 |
'name.*.last' => 'string', |
6 |
]);
|
7 |
}
|
Avrai notato che la forma della convalida è name.*.last
, con un asterisco in mezzo, che quasi indica che si potrebbe aggiungere la chiave di un'array o quello che preferisci.
Conclusione
Laravel 5.2 è una piccola release che ti permette di lavorare meglio e in maniera più veloce. Come puoi notare, molte di queste feature sono anche semplici da imparare.