Описание реализации внедрения зависимостей в PHP.
Английский
[Китайский]
Установить pinject можно через Packagist:
https://packagist.org/packages/jesusslim/pinject
Для этого выполните команду: composer require jesusslim/pinject
Если вашему Composer не разрешено использовать dev-master, добавьте эту конфигурацию в ваш composer.json:
"minimum-stability": "dev"
Интерфейс Injector определяет следующие методы:
При использовании интерфейса Injector необходимо наследовать его в своём классе.
Пример сопоставления экземпляра (числа или объекта и т. д.) с контейнером:
$injector->mapData('test',12345);
$injector->mapData(Student::class,new Student('Slim'));
Пример сопоставления класса (неинициализированного) с контейнером:
$injector->mapSingleton(StudentInterface::class,GoodStudent::class);
Пример создания экземпляра:
$injector->produce(StudentInterface::class);
Пример вызова функции:
Вызывается метод, аргументы которого автоматически заполняются на основе содержимого контейнера.
$injector->call(function(Student $std){ ... });
Пример вызова метода класса:
Метод класса вызывается автоматически с помощью pinject. Аргументы метода автоматически заполняются на основе содержимого контейнера.
$injector->callInClass($class_name,$action,$out_params);
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 )