Inject in PHP !
PHP依赖注入实现.
English [Chinese]
pinject in packagist:https://packagist.org/packages/jesusslim/pinject
Install:
composer require jesusslim/pinject
If your composer not allowed dev-master,add this config
"minimum-stability": "dev"
into your composer.json.
InjectorInterface定义了以下接口方法
map //map一个实例或者类或者闭包函数到容器内
get //get things your mapped
produce //生产实例
使用时 将自己的类继承Inject即可使用以下方法
//map一个实例(数值或object等)到容器中
$injector->mapData('test',12345);
$injector->mapData(Student::class,new Student('Slim'));
//map一个类(未实例化)到容器中
$injector->mapSingleton(StudentInterface::class,GoodStudent::class);
//生产实例
//如果参数key能在已map的实例中找到 则直接返回实例
//如果参数key能在已map的类名中找到 则判断是否实例化过 如果是则直接返回之前实例化的该类的实例 否则实例化 并返回
//如果都没有找到 则默认会尝试反射该类 并实例化 如果我们调用了mustReg()方法 则强制任何实例化的类都必须被map过 否则不进行反射 这个根据具体使用场景决定是否设置
$injector->produce(StudentInterface::class);
//call an function
//调用一个方法 方法的入参会根据容器内的内容自动填充
$injector->call(function(Student $std){
...
});
//call an function in class
//调用一个类中的方法 类会根据pinject自动实例化 方法的入参会根据容器内的内容自动填充
$injector->callInClass($class_name,$action,$out_params);
Chains提供链式操作的实现
Example:
$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();
//or use runWith($your_last_chain_func);
chain接收一个闭包函数或者一个类名,如果是类名则会用pinject去实例化,并调用该实例的handle方法(默认handle 可用action方法去设置具体调用什么方法)。所有闭包或者处理方法都必须接收以下两个参数:一个是在链式操作内传递的对象/数组,第二个是下一个处理chain。如果处理完毕没有问题并且可用继续,则必须调用下一个方法并传递参数。
另一种用法:
另一种用法是使用runWild方法替代run/runWith,类似于golang Martini/Injector的用法。
例子:
$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限定了每一环的handler的入参,必须为传递的对象以及下一环调用,而runWild可以接收任意形式的handler作为一环,但是只要其中某一环的handler返回了任何内容,循环就会结束并返回结果。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型