Russian (Pусский) translation by Sergey Zhuk (you can also view the original English article)
В этой статье я рассмотрю новые возможности Laravel 5.2 и опишу по порядку каждую из них. Вот список нововведений:
- Неявная привязка модели к маршруту
- Валидация массивов в форме
- Middleware для ограничения запросов к API
- Группы middleware
- Генерация аутентификации
- Разные драйвера для аутентификации
Несколько драйверов для аутентификации
Эта возможность может оказаться полезной особенно, когда нужно использовать Doctrine ORM аутентификацию с несколькими провайдерами. В моих проектах я предпочитаю иметь отдельную аутентификацию для админов и отдельную для пользователей; данная возможность поможет очень легко получить это. Рассмотрим пример 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 |
],
|
Теперь мы можем использовать Auth::attempt([...])
, здесь Laravel вызовет аутентификатора по умолчанию; таким образом если нужно вызвать другого аутентификатора, то нужно указать его имя, например Auth::guard('admin')
.
Для аутентификации вашей группы маршрутов определенным аутентификатором, можно просто указать его имя:
1 |
Route::group(['middleware' =>['auth:admin']], function () { |
2 |
//...
|
3 |
}
|
Иногда, вместо простого логина в вашем приложении, вы хотите чтобы пользователи добавляли api_token
к концу строки запроса и использовали его для аутентификации запроса. TokenGuard поможет вам легко достичь этой цели.
Если вы хотите использовать аутентификацию по токену, то сначала нужно добавить уникальное поле api_token
, длиной в 60 символов в таблицу вашей модели. Теперь вы легко можете использовать аутентификатор api
в вашем приложении.
Неявная привязка модели к маршруту
Одна из новых возможность в Laravel 5.2 и которая является довольно практичной - привязка модели к маршруту. Вы можете привязать модель к вашему маршруту; но сначала сделаем эту привязку вручную:
1 |
Route::get('user/{id}', function ($id) { |
2 |
$user = Users::findOrFail($id); |
3 |
// ...
|
4 |
});
|
Или же можно сделать что-то вроде такого:
1 |
//...
|
2 |
$router->model('user', 'App\User'); |
3 |
//...
|
4 |
|
5 |
$router->get('profile/{user}', function(App\User $user) { |
6 |
//
|
7 |
});
|
С Laravel 5.2 это сделать очень легко. Просто передайте параметр в замыкание с маршрутом, и вы автоматически можете рассматривать его как привязку модели:
1 |
Route::get('user/{id}', function (App\User $user) { |
2 |
//...
|
3 |
});
|
Теперь стало еще легче привязывать модель к маршруту.
По умолчанию Laravel осуществляет привязку по полю id. Но если вы хотите поменять это поведение, то это можно сделать следующим образом:
1 |
class User extends Model |
2 |
{
|
3 |
public function getRouteKeyName() |
4 |
{
|
5 |
return 'UserEmail'; |
6 |
}
|
7 |
}
|
Eloquent реализует интерфейс Illuminate\Contracts\Routing\UrlRoutable
, так что вы можете переопределить метод getRouteKeyName()
. Он определяет какое поле в таблице использовать для поиска по параметру из URL.
Группы middleware
Как мы могли увидеть выше, мы создали несколько аутентификаций для админа и для пользователей. В таком случае, если вы хотите привязать несколько middleware к группе маршрутов пользователя, то с Laravel 5.2 вы можете создать для них окрашенное название и использовать его.
Чтобы определить группу middleware, следует внести изменения в файл kernel.php в папке https:
1 |
protected $middlewareGroups = [ |
2 |
//...
|
3 |
'admin' => [ |
4 |
'acl', |
5 |
'web', |
6 |
'auth', |
7 |
]
|
8 |
];
|
И теперь вы легко можете использовать группу в в ваших маршрутах.
Middleware для ограничения запросов по API
Если вы используете API стороннего приложения, такого как например GitHub, для запросов с использованием базовой аутентификации или OAuth, то вы можете выполнять до 5000 запросов в час. Этот лимит называется ограничением скорости. Если вы хотите иметь что-то похожее в своем приложении, то можете использовать новую возможность Laravel 5.2. В Laravel 5.2 было добавлено новое throttle
middleware, которое следит за ограничениями скорости запросов. Например вы можете сделать что-то вроде этого:
1 |
Route::group(['prefix' => 'api', 'middleware' => 'throttle'], function () { |
2 |
Route::get('user', function () { |
3 |
return Users::all(); |
4 |
});
|
5 |
});
|
По умолчанию в kernel.php
middleware throttle
позволяет 60 попыток в минуту:
1 |
//...
|
2 |
'api' => [ |
3 |
'throttle:60,1', |
4 |
'auth:api', |
5 |
],
|
Вы можете изменить это пожеланию или даже настроить для определенного роутера.
1 |
Route::group(['prefix' => 'api', 'middleware' => 'throttle:10,1000'], function () { |
2 |
Route::get('user', function () { |
3 |
return Users::all(); |
4 |
});
|
5 |
});
|
Заготовки для аутентификации
Laravel 5.2 предоставляет быстрый способ сгенерировать все, что вам нужно для аутентификации с помощью одной команды:
1 |
php artisan make:auth |
С помощью этой команды в вашем приложении будут сгенерированы пути и файлы отображений для логина и регистрации. Мои пути выглядят следующим образом:
1 |
Route::group(['middleware' => 'web'], function () { |
2 |
Route::auth(); |
3 |
Route::get('/home', 'HomeController@index'); |
4 |
});
|
Метод Route::auht()
это сокращение для определения следующих путей:
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'); |
Так же будет сгенерирован HomeController
, который отвечает за запросы логина на основную панель вашего приложения. Но вы также можете настроить или вообще убрать этот контроллер, все зависит от требований вашего приложения.
Валидация массивов в форме
Одна интересная вещь, с которой мне приходилось работать, это данные формы в виде массивов в HTML. Если вы укажите что-нибудь в квадратных скобках, то результирующий массив станет ассоциативным, иначе он будет простым:
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>
|
Результат PHP print_r($_POST)
будет следующим:
1 |
array( |
2 |
'name' => array( |
3 |
'first' => '' |
4 |
'last' => '' |
5 |
)
|
6 |
)
|
Это поможет вам упростить процесс валидации и работы с формами. Теперь рассмотрим валидацию наших полей в Laravel 5.2:
1 |
public function Validator() |
2 |
{
|
3 |
$this->validate(Request::all(), [ |
4 |
'name.*.first' => 'required|string', |
5 |
'name.*.last' => 'string', |
6 |
]);
|
7 |
}
|
Возможно, вы заметили, что форма проверки выглядит как name.*.last
, со звездочкой в середине, которая означает, что вы могли бы добавить ключ массива или что-нибудь еще, что вам может понадобиться.
Заключение
Laravel 5.2 был довольно маленьким релизом, который позволит вам работать лучше и быстрее. Как вы могли заметить, многие из этих возможностей также легки в освоении.