1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/JesusSlim-pinject

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_CN.md 6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 13:29 a9b57d3

pinject

PHP-зависимость: внедрение (инъекция)

Описание реализации внедрения зависимостей в PHP.

Использование

Английский
[Китайский]

Установка

Установить pinject можно через Packagist:
https://packagist.org/packages/jesusslim/pinject

Для этого выполните команду: composer require jesusslim/pinject

Если вашему Composer не разрешено использовать dev-master, добавьте эту конфигурацию в ваш composer.json:

"minimum-stability": "dev"

Injector

Интерфейс Injector определяет следующие методы:

  • map — сопоставляет экземпляр, класс или функцию замыкания с контейнером;
  • get — получает элементы, которые вы сопоставили;
  • produce — создаёт экземпляр.

При использовании интерфейса Injector необходимо наследовать его в своём классе.

Пример сопоставления экземпляра (числа или объекта и т. д.) с контейнером:

$injector->mapData('test',12345);
$injector->mapData(Student::class,new Student('Slim'));

Пример сопоставления класса (неинициализированного) с контейнером:

$injector->mapSingleton(StudentInterface::class,GoodStudent::class);

Пример создания экземпляра:

  • Если параметр key можно найти в сопоставленном экземпляре, то он будет возвращён напрямую.
  • Если ключ можно найти в имени сопоставленного класса, то проверяется, был ли класс уже инициализирован. Если да, то возвращается предыдущий экземпляр этого класса. В противном случае класс инициализируется и возвращается.
  • Если ничего из вышеперечисленного не найдено, то по умолчанию будет предпринята попытка отражения этого класса. Если мы вызываем метод mustReg(), то все экземпляры классов, которые были сопоставлены, должны быть обязательно отображены. В противном случае отражение не выполняется. Это зависит от конкретной ситуации использования.

$injector->produce(StudentInterface::class);

Пример вызова функции:

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

$injector->call(function(Student $std){ ... });

Пример вызова метода класса:

Метод класса вызывается автоматически с помощью pinject. Аргументы метода автоматически заполняются на основе содержимого контейнера.

$injector->callInClass($class_name,$action,$out_params);

Chains

Chains предоставляет реализацию для цепочечных операций.

Пример:

$chains = new Chains($app);
//$app — это класс Injector или его подкласс. $chains->chain(RequestHandler::class)
->chain(function($data,$next){
$r = Auth::checkToken($data['token']);
if($r !== true){
dump("Token wrong");
}else{
$next($data);
}
})
->chain(Student::class)
->chain(function($data){
dump($data);
})
->action('handle')
->run();
//или используйте runWith($your_last_chain_func);

Chain принимает функцию замыкания или имя класса. Если это имя класса, оно будет создано с помощью pinject и будет вызван метод handle (по умолчанию handle). Все функции замыкания или обработчики должны принимать два аргумента: объект или массив, передаваемый в цепочке операций, и следующий обработчик. Если обработка завершена успешно и может быть продолжена, необходимо вызвать следующий метод и передать параметры.

Другой способ использования:

Вместо run/runWith можно использовать runWild. Это похоже на использование Martini/Injector в Golang.

Пример:

$chains = new \Inject\Chains($app);
$app->mapData('any_param_here','Example');
$the_given_params_for_handlers = [
'seems_wild' => 'OK'
];
$rtn = $chains->chain(function($any_param_here,$seems_wild){
var_dump($any_param_here.' is '.$seems_wild);
})->chain(function(){
return "END";
})->data($the_given_params_for_handlers)
->runWild();
var_dump($rtn);

Разница между ними заключается в том, что run/runWith ограничивает входные параметры каждого цикла обработчика, которые должны быть переданы объекту и следующему вызову. А runWild может принимать обработчики любой формы в качестве одного цикла, но если какой-либо цикл обработчика возвращает что-либо, цикл завершается и возвращает результат.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/JesusSlim-pinject.git
git@api.gitlife.ru:oschina-mirror/JesusSlim-pinject.git
oschina-mirror
JesusSlim-pinject
JesusSlim-pinject
master