Статьи

Пять скрытых жемчужин Ларавела

Многие разработчики, которые используют 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 для группировки статей по категории, в которой они были опубликованы.

Все статьи, относящиеся к одной категории, будут сгруппированы. Затем вы можете получить статьи для определенной категории.

1
2
3
foreach ($results->get(‘tutorial’) as $article) {
    echo $article->body;
}

Коллекции являются одним из лучших скрытых драгоценных камней, которые Laravel может предложить.

Доступно с: v4.1.19
Документально: нет

Фильтрация маршрутов в Laravel — это общая задача, которую многие из нас выполняют во всех наших проектах. Фильтр позволяет выполнять такие задачи, как аутентификация пользователя или ограничение скорости, до или после запуска маршрута. Мы создаем фильтры с помощью Route::filter и можем применять их к отдельным маршрутам, группе маршрутов или с помощью Route::when и применяя к сопоставленному шаблону.

В этом примере мы создаем 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, — это покопаться в источнике. Это не так страшно, как вы думаете, и вы многое узнаете о структуре, на которой вы строите.

Если у вас есть дополнительные драгоценные камни, которые вы нашли, не стесняйтесь делиться ими в комментариях!