Основы
Пакеты (англ. bundle) лежат в основе улучшений, сделанных в Laravel 3. Они позволяют легко структурировать код в удобные для распространения модульные «пакеты». Пакет может иметь свои собственные шаблоны, настройки, маршруты, миграции, задания «Artisan» и т.д. Пакетом может быть всё — начиная от ORM и заканчивая продвинутой системой управления правами. Модульность такого рода — важное понятие, которое стоит почти за всеми решениями в Laravel. На самом деле, во многих случаях вы можете думать о папке application как о специальном пакете, с которым Laravel работает по умолчанию.
Создание пакетов
Первый шаг при создании пакета — сделать для него папку в bundles.Например, давайте создадим пакет admin, который будет содержать в себе административный центр управления нашим приложением. Файл application/start.php даёт возможность настроить окружение, в котором будет работать наше вёб-приложение; точно так же мы создадим файл start.php в папке нашего нового пакета — он будет загружаться каждый раз при запуске пакета.
<?php
// Файл: bundles/admin/start.php
Autoloader::namespaces(array(
'Admin' => Bundle::path('admin').'models',
));
Здесь мы говорим автозагрузчику, что классы в пространстве имён PHPAdmin
должны загружаться из папки models нашего пакета. Вы можете делать всё, что угодо в своём start.php, но обычно он предназначен для регистрации классов в автозагрузчике. Но на самом деле вам даже не обязательно создавать этот файл.
Теперь посмотрим, как зарегистрировать пакет в нашем приложении.
Регистрация пакетов
Теперь когда у нас есть пакет admin нам нужно его зарегистрировать внутри Laravel. Откройте файл application/bundles.php — это как раз то место, куда вносятся все пакеты.
<?php
// Файл: application/bundles.php
return array('admin');
По умолчанию Laravel предположит, что пакет admin находится внутри папки bundles, но при желании мы можем указать иное размещение:
<?php
// Файл: application/bundles.php
return array(
'admin' => array('location' => 'userscape/admin'),
);
После этого Laravel будет искать пакет в bundles/userscape/admin.
Загрузка классов
Обычно start.php любого пакета содержит только определения для автозагрузчика классов. Если это так, то мы можем не создавать этот файл, а внести их прямо в запись пакета в PHPapplication/bundles.php
.
Задание правил автозагрузки в настройках пакета:
<?php
// Файл: application/bundles.php
return array(
'admin' => array(
'autoloads' => array(
'map' => array(
'Admin' => '(:bundle)/admin.php',
),
'namespaces' => array(
'Admin' => '(:bundle)/lib',
),
'directories' => array(
'(:bundle)/models',
),
),
),
);
Заметьте, что каждый элемент массива соответствует методу автозагрузчика. На самом деле значения этих настроек автоматически передаются в соответствующий метод.
Как вы видите, здесь используется (:bundle) — она заменяется на путь к пакету, чтобы вам не нужно было писать его вручную.
Запуск пакетов
Наш пакет создан и зарегистрирован, но мы ещё не можем его использовать. Для начала нам нужно его запустить; это делается следующим вызовом:
Bundle::start('admin');
Laravel загрузит файл start.php в папке пакета, а так же routes.php, где обычно регистрируются маршруты и контроллеры. Любой из файлов загружается только, если он существует.
Пакет запускается только один раз, все последующие вызовы PHPBundle::start
будут проигнорированы.
Если вы очень часто используете какой-то пакет в своём приложении, то было бы полезно запускать его в начале каждого запроса. Это можно сделать, настроив application/bundles.php.
Включение автозапуска для пакета:
<?php
// Файл: application/bundles.php
return array(
'admin' => array('auto' => true),
);
Вам не всегда понадобиться запускать пакет вручную — вы можете использовать его при необходимости, а Laravel загрузит его сам. Это произойдён при обращении к его шаблону, настройке, языковой строке, маршруту или фильтру.
Каждый раз при запуске пакета возникает событие, которое вы можете отслеживать.
Отслеживание события при запуске пакета:
Event::listen('laravel.started: admin', function () {
// Пакет "admin" был запущен...
});
Отключение пакета — он никогда не будет запущен:
Bundle::disable('admin');
Маршрутизация
См. соответствующие разделы в документации по маршрутам и контроллерам.
Обращение к ресурсам
Как уже упоминалось выше, пакеты могут содержать шаблоны, настройки, языковые файлы и многое другое. Laravel использует двойное двоеточие (::) для указания пакета в имени этих элементов.
return View::make('admin::view');
// возможное размещение: bundles/admin/views/view.php
return Config::get('admin::file.option');
// возможное размещение: bundles/admin/config/file.php
Чтение языковой строки пакета:
return Lang::line('admin::file.line');
// возможное размещение: bundles/admin/languages/en/file.php
Иногда вам может понадобиться узнать системную информацию о пакете — существует ли он, где находится или что-то из его опций в application/bundles.php. Посмотрим, как это делается.
Определение существования пакета:
Bundle::exists('admin');
$location = Bundle::path('admin');
$config = Bundle::get('admin');
Получение списка установленных пакетов:
$names = Bundle::names();
Публикация вёб-содержимого
Если ваш пакет содержит шаблоны, то он наверняка содержит и нужные ему файлы JavaScript, картинки и прочее — они обычно расположены в его подпапке public. Однако для доступа из Интернета они должны быть внутри папки public вашего приложения — для этого просто скопируйте их туда (например, bundles/admin/public/styles.css в public/bundles/admin/styles.css).
Если у вас есть доступ к командной строке, вы можете использовать «Artisan»:
shphp artisan bundle:publish
Эта команда создаст подпапку в public для каждого пакета и скопирует туда все файлы из его папки public. Например, если у вас есть пакет admin, Artisan разместит его ресурсы в public/bundles/admin.
Больше информации о том, как удобно адресоваться к ресурсам вашего пакета содержится в разделе про ресурсы.
Установка пакетов
Конечно, вы можете устанавливать пакеты вручную, но интерфейс командной строки «Artisan» даёт возможность автоматически устанавливать и обновлять их. Для распространения пакетов используются обычные ZIP-архивы.
Установка пакета с помощью Artisan:
shphp artisan bundle:install eloquent
Отлично! Теперь вы можете зарегистрировать ваш новый пакет и опубликовать его вёб-содержимое.
Официальное хранилище пакетов: http://bundles.Laravel.com.
Обновление пакетов
При обновлении с помощью «Artisan» старая папка пакета будет полностью удалена, включая файлы настроек и ваши другие возможные изменения.
shphp artisan bundle:upgrade admin
Внимание: после обновления вам может потребоваться переопубликовать вёб-содержимое данного пакета.
Так как обновление полностью удаляет старую версию пакета на данный момент рекомендуется использовать события загрузки для изменения настроек пакета вместо использования его папки config. Например:
// Файл: application/start.php
Event::listen('laravel.started: admin', function () {
Config::set('admin::file.option', 'the_value');
});