Просмотр поста

.
Delphinum
Автозагрузчик ресурсов
Пакет Bricks.Autoload решает довольно тривиальную задачу загрузки ресурсов (классов, файлов, конфигураций приложения) по их имени. Другими словами, этот пакет автоматически загружает требуемые вам классы без необходимости использования команд include/require. Практически все фреймворки включают подобный пакет, так как он сильно упрощает процесс разработки.

Давайте познакомимся с ним на примере приложения вида:

lib/
  MyClass.php
templates/
  index.html
index.php


Основным файлом здесь является index.php, расположенный в корневом каталоге приложения и использующий как класс из файла lib/MyClass.php, так и файл templates/index.html:

// Файл index.php
require_once('lib/MyClass.php');

$obj = new MyClass;
$template = file_get_contents('templates/index.html');
...


Как видно приходится указывать полные пути до ресурсов приложения, класса MyClass и файла index.html. Пока ресурсов мало это не очень мешает разработке, но когда число файлов переваливает за несколько десятков, становится все сложнее уследить за загрузкой ресурсов.

Bricks.Autoload решает эту проблему довольно просто:

// Файл index.php
require_once('vendor/autoload.php');
use Bricks\Autoload\Loader;

$loader = new Loader;
$loader->map('MyClass', 'lib/MyClass.php');
$loader->map('template', 'templates/template/index.html');

$obj = new MyClass;
$template = file_get_contents($loader->path('template', 'html'));
...


На первый взгляд может показаться что кода стало в разы больше, но вскоре вы убедитесь, что это легко решается. Дайте сначала оценим изменения. Мы подключили автозагрузчик и указали ему пути поиска файлов ресурсов с помощью метода map. Теперь, если вы используете класс, который был перечислен в этом методе (на пример MyClass), он будет автоматически загружен из файла lib/MyClass.php. Более того, вы можете получить адрес файла шаблона index.html по с помощью метода path автозагрузчика.

Расширим наш пример, добавив несколько новых классов и шаблонов:

lib/
  User.php
  News.php
  Comment.php
templates/
  index.html
  user_list.html
  user_edit.html
  news.html
index.php


Перечислять все файлы в методе map будет очень утомительно, потому на этот раз мы воспользуемся методом pref, который позволяет указать не файл, содержащий ресурс, а каталог, в котором его необходимо найти:

// Файл index.php
require_once('vendor/autoload.php');
use Bricks\Autoload\Loader;

$loader = new Loader;
$loader->pref('lib', 'lib');
$loader->pref('tpl', 'templates');

$user = new lib\User;
$template = file_get_contents($loader->path('tpl\user_list', 'html'));
...


Для автоматической загрузки PHP классов он обязательно должны располагаться в соответствующих namespace. Так, класс User из примера должен иметь полное имя lib\User и т.д.

// Файл lib/User.php
namespace lib;

class User{
   ...
}


Если файл можно определить по его имени, использовать методы pref и map не следует. Автозагрузчик самостоятельно найдет файл ресурса и загрузит его:

// Файл index.php
require_once('vendor/autoload.php');
use Bricks\Autoload\Loader;

$loader = new Loader;

$user = new lib\User;
$template = file_get_contents($loader->path('templates\user_list', 'html'));
...


Эти методы нужны только в том случае, если по полному имени ресурса невозможно точно определить его местоположение в файловой системе. На пример:


lib/
  Users/
    User.php
index.php


// Файл lib/Users/User.php
namespace Users;

class User{
   ...
}


Как видно, класс Users\User нельзя преобразовать в адрес файла, его содержащего. В этом случае используется метод map или pref:

// Файл index.php
require_once('vendor/autoload.php');
use Bricks\Autoload\Loader;

$loader = new Loader;
$loader->pref('Users', 'lib/Users');

$user = new Users\User;
...


Метод map менее ресурсоемкий, нежели pref, так как определяет прямое соответствие имени ресурса файлу, его содержащему. Поиск файла ресурса в каталоге требует, хоть и не намного, но все же большей работы от автозагрузчика. Не рекомендуется "экономить" на этом, но об этом так же не следует забывать.

Архив с примером.