Пакеты(packages) в Fuelphp

в 15:38, , рубрики: codeigniter, fuelphp, Kohana, service, symfony, метки: ,

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

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

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

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

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

Обратимся к 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
image

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

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

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

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

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

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

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

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

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

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. Он нужен для отладки кода, когда нужно быстро посмотреть что возвращает метод или переменная. Итак, допустим мы пишем сотый метод нашего приложения:

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
— применение паттернов и подключение дополнительного функционала к уже имеющимся пакетам, как в пакете fuel-ninjauth который является адаптером к стандартному пакету Auth.
— пакеты позволяют брать на себя функции формирования представлений, а при желании в обычных контроллерах можно оставить только проверки и ввод-вывод, перенеся все остальное в пакеты.
— пакеты позволяют абстрагироваться от другого кода в приложении, его проще тестировать и подключать в другом проекте
— объекты и методы пакета становятся доступными в контексте всего приложения
— использование пакетов делает ваше приложение легче и быстрее

Src

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

Автор: MaxZN

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js