Многие разработчики, которые используют Laravel , вероятно, лишь лишь слегка касаются поверхности того, что может предложить фреймворк. Хотя документация охватывает наиболее распространенные случаи использования и очевидные особенности, она не охватывает все.
Не поймите меня неправильно, с документацией все в порядке, просто вы можете сделать так много, что трудно все документировать. Из-за этого мы собираемся взглянуть на некоторые из скрытых драгоценных камней, которые скрываются в Laravel.
Каскадные виды
Доступно с: v4.0.0
Документально: нет
Представления могут каскадироваться так же, как файлы конфигурации. Каскадные представления чрезвычайно полезны при разработке расширяемой системы тем. Рассмотрим следующую структуру каталогов.
01
02
03
04
05
06
07
08
09
10
|
/app
/views
/blog
/index.blade.php
/themes
/default
/views
/blog
/index.blade.php
/theme.blade.php
|
Идея заключается в том, что когда мы return View::make('theme::blog.index');
сначала он будет искать в каталоге themes/default/views
а затем, если не сможет найти представление, вернуться к app/views
.
Для этого мы используем View::addNamespace
чтобы зарегистрировать наше собственное пространство имен в двух местах.
1
2
3
4
|
View::addNamespace(‘theme’, [
base_path().’/themes/default/views’,
app_path().’/views’
]);
|
Коллекции
Доступно с: v4.0.0
Документально: частично
Коллекции являются отличным способом взаимодействия и управления массивами. Коллекции имеют множество удобных методов и реализуют ряд полезных интерфейсов, таких как ArrayableInterface
, IteratorAggregate
и JsonableInterface
.
Допустим, мы создаем небольшой движок для блогов, который использует плоские файлы для хранения. Мы хотим иметь возможность выполнять такие операции, как сортировка, фильтрация и разбиение на страницы.
Реализация механизма ведения блогов выходит за рамки этой статьи, но давайте представим, что у нас есть массив $articles
article, и каждый член массива является экземпляром класса Article
. Все, что нам нужно сделать, это получить новый экземпляр Collection
и предоставить ему наш массив статей.
1
|
$articles = new Illuminate\Support\Collection($arrayOfArticles);
|
Сортировка
Используя коллекцию, мы можем отсортировать наши статьи. Давайте сначала рассортируем наши статьи и покажем самые последние обновленные статьи. Для этой статьи давайте представим, что при загрузке статей из файловой системы мы устанавливаем для свойства updatedAt
время последнего изменения файла.
1
2
3
|
$articles->sortByDesc(function ($article) {
return $article->updatedAt;
});
|
sortBy
и sortByDesc
принимают обратный вызов, этот обратный вызов должен возвращать значение, которое можно использовать для сортировки коллекции. В нашем случае мы можем просто вернуть статьи, которые были изменены в последний раз, и коллекция может сортироваться на основе этого.
фильтрация
Подобно сортировке, мы также можем использовать коллекцию для фильтрации наших статей, подобно предложению WHERE
в MySQL. Давайте отфильтруем наши статьи по поиску, который мог быть выполнен.
1
2
3
4
5
6
7
|
<?php
$searchQuery = ‘Laravel rocks!’;
$results = $articles->filter(function ($article) use ($searchQuery) {
return preg_match(sprintf(‘/%s/m’, $searchQuery), $article->body);
});
|
Метод filter
самом деле возвращает новый экземпляр Illuminate\Support\Collection
поэтому нам нужно присвоить его переменной $results
. Эта новая коллекция будет содержать только те предметы, которые упоминают «Скалы Ларавела!» В теле.
пагинация
Используя коллекцию, мы можем разбить наши статьи на страницы, чтобы у нас не было слишком большого количества статей на одной странице.
01
02
03
04
05
06
07
08
09
10
11
|
$perPage = 1;
$page = Input::get(‘page’, 1);
if ($page > ($articles->count() / $perPage)) {
$page = 1;
}
$pageOffset = ($page * $perPage) — $perPage;
$results = $articles->slice($pageOffset, $perPage);
|
Используя метод slice
, мы извлекаем часть статей в коллекции и присваиваем ее переменной $results
.
Этот пример можно было бы сделать еще дальше, создав новый экземпляр класса Paginator
от Laravel. Таким образом, он может генерировать все номера страниц и ссылки для вас.
Есть еще кое-что!
Мы могли бы получить случайную статью:
1
|
$article = $articles->random();
|
Мы также можем перебирать нашу коллекцию статей, как если бы это был обычный массив. Это все благодаря интерфейсам IteratorAggregate
и ArrayIterator
.
1
2
3
|
foreach ($articles as $article) {
echo $article->body;
}
|
И мы можем даже преобразовать наши статьи в обычный массив или в его представление JSON.
1
2
|
$array = $articles->toArray();
$json = $articles->toJson();
|
Один из самых крутых методов, вероятно, groupBy
, который позволяет группировать статьи по определенному ключу. Представьте, что в каждой статье есть метаданные вверху, которые анализируются и удаляются из тела статей.
Хотя синтаксический анализ этих метаданных выходит за рамки данной статьи, мы предполагаем, что он анализируется и является свойством экземпляра Article
. Затем вы можете использовать groupBy
для группировки статей по категории, в которой они были опубликованы.
$results = $articles->groupBy('category');
Все статьи, относящиеся к одной категории, будут сгруппированы. Затем вы можете получить статьи для определенной категории.
1
2
3
|
foreach ($results->get(‘tutorial’) as $article) {
echo $article->body;
}
|
Коллекции являются одним из лучших скрытых драгоценных камней, которые Laravel может предложить.
Фильтры регулярных выражений
Доступно с: v4.1.19
Документально: нет
Фильтрация маршрутов в Laravel — это общая задача, которую многие из нас выполняют во всех наших проектах. Фильтр позволяет выполнять такие задачи, как аутентификация пользователя или ограничение скорости, до или после запуска маршрута. Мы создаем фильтры с помощью Route::filter
и можем применять их к отдельным маршрутам, группе маршрутов или с помощью Route::when
и применяя к сопоставленному шаблону.
Route::filter('restricted', function($route, $request, $group) { // Restrict user access based on the value of $group }); Route::when('admin/*', 'restricted:admin');
В этом примере мы создаем restricted
фильтр, который ожидает один параметр $group
. Параметры $route
и $request
всегда передаются фильтру before.
Но что, если мы хотим большей гибкости? Допустим, мы хотели применить фильтр ко всем маршрутам admin
кроме admin/login
. Мы могли бы использовать группу маршрутов и просто переместить рассматриваемый маршрут за пределы группы. Или мы можем использовать Route::whenRegex
и написать собственное регулярное выражение.
1
|
Route::whenRegex(‘/^admin(\/(?!login)\S+)?$/’, ‘restricted:admin’);
|
Это регулярное выражение просто гарантирует, что оно применяется только к маршрутам, которые начинаются с admin
и за которыми не следует /login
, но за ним может следовать что-либо еще. Отлично. Теперь у нас есть фильтр с restricted:admin
для всех маршрутов, кроме нашего маршрута admin/login
.
Сумка сообщений
Доступно с: v4.0.0
Документально: частично
Вы, без сомнения, уже некоторое время используете Illuminate\Support\MessageBag
даже не осознавая этого. Самая большая роль, которую играет MessageBag
содержит все ваши ошибки валидации при использовании встроенного валидатора Laravel.
Переменная
$errors
доступна в каждом представлении, которое будет содержать либо пустой экземплярMessageBag
либо экземпляр, который вы перенесли в сеанс с помощьюRedirect::to('/')->withErrors($validator);
Существует большая вероятность того, что многие из вас могут делать что-то подобное в формах при отображении сообщения об ошибке под определенным вводом.
1
2
3
4
|
{{ Form::text(‘username’, null) }}
@if($errors->has(‘username’))
<div class=»error»>{{ $errors->first(‘username’) }}></div>;
@endif
|
На самом деле вы можете полностью удалить этот оператор if
и использовать второй параметр first
метода, чтобы обернуть сообщение в div
.
1
2
|
{{ Form::text(‘username’, null) }}
{{ $errors->first(‘username’, ‘<div class=»error»>:message</div>’) }}
|
Много, намного, намного лучше!
беглый
Доступно с: v3.0.0
Документально: частично
Класс Fluent
существует уже давно и фактически используется в самой среде при создании миграций с помощью компоновщика схем. Между Laravel 3 и Laravel 4 сам класс почти не изменился, единственное большое отличие — еще несколько интерфейсов.
Чтобы использовать класс Fluent
все, что вам нужно сделать, — это получить экземпляр и все готово.
1
2
|
$user = new Illuminate\Support\Fluent;
$user->name(‘Jason’)->country(‘Australia’)->subscriber();
|
Теперь у экземпляра определены 3 атрибута: name
со значением Jason
, country
со значением Australia
и subscriber
с логическим значением true
.
До Laravel 4.1 вы могли только устанавливать и получать атрибуты из экземпляра. Начиная с Laravel 4.1 вы можете использовать методы toArray
и toJson
чтобы получить массив атрибутов и его JSON-представление соответственно.
Начиная с Laravel 4.2, класс также реализует интерфейс JsonSerializable
есть вы можете передать экземпляр непосредственно в json_encode
.
Там еще больше!
Мы рассмотрели несколько полезных жемчужин фреймворка Laravel. Но, как вы уже догадались, в структуре есть еще больше.
Лучший способ узнать, что еще может предложить Laravel, — это покопаться в источнике. Это не так страшно, как вы думаете, и вы многое узнаете о структуре, на которой вы строите.
Если у вас есть дополнительные драгоценные камни, которые вы нашли, не стесняйтесь делиться ими в комментариях!