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