Advertisement
  1. Code
  2. Laravel 5

Новые возможности в Laravel 5.2

Scroll to top
Read Time: 5 min

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 был довольно маленьким релизом, который позволит вам работать лучше и быстрее. Как вы могли заметить, многие из этих возможностей также легки в освоении.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.