- PVSM.RU - https://www.pvsm.ru -

Пакеты(packages) в Fuelphp

В данной статье я бы хотел поделиться знаниями о том, как устроены, для чего нужны и что из себя представляют packages [1](далее пакеты) в Fuelphp [2]. Прошу помочь сравнить реализацию и возможности пакетов Fuelphp с аналогами из других фримворков. Думаю всем будет интересно узнать мнение адептов Simfony2 и Yii по этому поводу, милости просим, кидайте свои выкладки в комменты. Далее в примерах будет рассмотрен пакет fuel-ninjauth [3]

Назначение пакетов в контексте Fuelphp

Для выполнения тех или иных повторяющихся глобальных задач, в приложении, уже давно применяется подход с использованием сервисов или же служб, что по сути одно и то же. Если просто, то сервис это объект, который выполняет какую-то глобальную задачу в контексте приложения. В Fuelphp роль таких сервисов выполняют пакеты.

Установка пакета

Пакетами можно делиться с сообществом. Есть несколько путей инсталляции пакетов, можно просто скопировать содержимое репозитория к себе в проект, использовать composer или воспользоваться утилитой oil [4].

Обратимся к oil с командой:

$ php oil package install ninjauth

Выполним миграцию, так как данный пакет использует данные из бд:

# Создадим таблицу users если таковой ещё нет
$ oil g migration create_users username:varchar[50] password:string group:int email:string last_login:integer login_hash:string profile_fields:text created_at:int
$ oil refine migrate

# Запустим миграцию для создания в бд таблицы "authentications"
$ oil refine migrate --packages=ninjauth

Структура пакета

Рассмотрим возможную структуру на примере пакета fuel-ninjauth [3]
image

1. Классы пакета

В папке classes находятся классы пакета. Пример [5]

1.1 Модели пакета

Модели также могут входить в состав классов пакета, когда пакет использует бд. Пример [6]

1.2. Контроллеры

Контроллеры в пакетах используются реже и в основном служат для формирования представлений внутри пакета. Пример [7] В итоге вся логика контроллера может сводится к чему то подобному:

return View::forge('register', array( //register - имя представления из папки №4 views 
			'user' => (object) compact('username', 'full_name', 'email', 'password')
		));

2. Конфигурация

Конфигурация или файл с настройками пакета. Пример [8]
Пример обращения к настройкам:

Config::get('ninjauth.default_group');

3. Миграции

В данной папке расположены классы миграций, которые нужны для быстрой сборки структуры данных в бд, создания необходимых таблиц и т.д.

4. Представления

В пакете могут использоваться представления. Как правило пакет обрабатывает логику и не связан с формированием представления напрямую, но иногда может оказаться, что формирование представления внутри пакета будет хорошим решением.
Пример представления:

<?php echo Form::open(null, array('id' => 'register')); ?>

	<?php if (isset($error)): ?>
		<span class="error"><?php echo $error; ?></span>
	<?php endif; ?>

	<p>
		<label for="username">Username</label>
		<?php echo Form::input('username', $user->username) ?>
	</p>
	<p>
		<label for="full_name">Full Name</label>
		<?php echo Form::input('full_name', $user->full_name) ?>
	</p>
	<p>
		<label for="email">Email</label>
		<?php echo Form::input('email', $user->email) ?>
	</p>
	<p>
		<label for="password">Password</label>
		<?php echo Form::password('password') ?>
	</p>
	<?php echo Form::submit('submit') ?>

<?php echo Form::close() ?>

5. Файл bootstrap.

Данный файл служит для описания файловой структуры пакета для автозагрузчика.

Autoloader::add_classes(array(
	'NinjAuth\Controller'               	        => __DIR__.'/classes/controller.php',
	'NinjAuth\Exception'  				=> __DIR__.'/classes/exception.php',
	'NinjAuth\CancelException'  		=> __DIR__.'/classes/exception.php',
	'NinjAuth\ResponseException'  	=> __DIR__.'/classes/exception.php',
	'NinjAuth\Model_Authentication'  	=> __DIR__.'/classes/model/authentication.php',

	'NinjAuth\Strategy'  				=> __DIR__.'/classes/strategy.php',
	'NinjAuth\Adapter'  				=> __DIR__.'/classes/adapter.php',
	'NinjAuth\Adapter_SimpleAuth'  	=> __DIR__.'/classes/adapter/simpleauth.php',
	'NinjAuth\Adapter_Sentry'  		=> __DIR__.'/classes/adapter/sentry.php',
	'NinjAuth\Adapter_Warden'  		=> __DIR__.'/classes/adapter/warden.php',

	'NinjAuth\Strategy_OAuth'  		=> __DIR__.'/classes/strategy/oauth.php',
	'NinjAuth\Strategy_OAuth2'  		=> __DIR__.'/classes/strategy/oauth2.php',
	'NinjAuth\Strategy_OpenId'  		=> __DIR__.'/classes/strategy/openid.php',
));

Важно понимать, что файлы загружаются автоматически, и только в случае использования методов пакета. Иными словами, если нигде в отработке скрипта не использовались методы пакета, то и его классы загружены не будут. Это делает ваше приложение легче и быстрее. Единственное о чем всегда знает приложение это о расположении файлов bootstrap.php:
image

Примеры использования

Пакет NinjAuth является адаптером для стандартного пакета автроизации и сделать простой пример его работы будет сложновато. Поэтому возьмем пакет fueltools [9]. Он нужен для отладки кода, когда нужно быстро посмотреть что возвращает метод или переменная. Итак, допустим мы пишем сотый метод нашего приложения:

public function action_save()
    {
        $var1 = 'var1';
        $var2 = 'var2';
        
        $orm = Model_Test::forge()->set('one', $var1)->set('two',$var2);

        FueltoolsFB::info($var1);
        FueltoolsFB::info($var2);
        FueltoolsFB::info($orm->save());
    }

Смотрим результат выполнения данного метода в консоли Firefox:image
Fuelphp загрузил только те классы пакетов ORM и FuelTools, которые требовались для отработки сценария:
image

Итоги

Fuelphp предоставляет в виде пакетов довольно широкие возможности:
— формирование упорядоченной и понятной архитектуры приложения
— применение сервисов, как в примере с fueltools [9]
— применение паттернов и подключение дополнительного функционала к уже имеющимся пакетам, как в пакете fuel-ninjauth [3] который является адаптером к стандартному пакету Auth.
— пакеты позволяют брать на себя функции формирования представлений, а при желании в обычных контроллерах можно оставить только проверки и ввод-вывод, перенеся все остальное в пакеты.
— пакеты позволяют абстрагироваться от другого кода в приложении, его проще тестировать и подключать в другом проекте
— объекты и методы пакета становятся доступными в контексте всего приложения
— использование пакетов делает ваше приложение легче и быстрее

Src

— пакет fuel-ninjauth [3]
— пакет fueltools [9]
— официальный репозиторий пакетов для Fuelphp github.com [10]
— репозиторий на форуме fuel-packages [11]

Автор: MaxZN


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/kohana/18198

Ссылки в тексте:

[1] packages: http://docs.fuelphp.com/general/packages.html

[2] Fuelphp: http://docs.fuelphp.com/

[3] fuel-ninjauth: https://github.com/happyninjas/fuel-ninjauth

[4] oil: http://docs.fuelphp.com/packages/oil/package.html

[5] Пример: https://github.com/happyninjas/fuel-ninjauth/blob/master/classes/strategy.php

[6] Пример: https://github.com/happyninjas/fuel-ninjauth/blob/master/classes/model/authentication.php

[7] Пример: https://github.com/happyninjas/fuel-ninjauth/blob/master/classes/controller.php

[8] Пример: https://github.com/happyninjas/fuel-ninjauth/blob/master/config/ninjauth.php

[9] fueltools: https://github.com/Maxlab/fueltools-package

[10] github.com: https://github.com/fuel-packages

[11] fuel-packages: http://fuelphp.com/forums/view/10