Php Silex界面注入
我正在尝试使用Silex\Application实现接口注入。 我在一个PHP文件中进行了引导,请记住,这在没有接口的情况下得到了简化:Php Silex界面注入,php,dependency-injection,silex,interface-injection,Php,Dependency Injection,Silex,Interface Injection,我正在尝试使用Silex\Application实现接口注入。 我在一个PHP文件中进行了引导,请记住,这在没有接口的情况下得到了简化: $app = new Silex\Application(); $app->register( new ServiceProvider($app) ); $app['testme'] = function() { throw new Exception('I am invoked'); }; $app->run(); 我有服务
$app = new Silex\Application();
$app->register(
new ServiceProvider($app)
);
$app['testme'] = function() {
throw new Exception('I am invoked');
};
$app->run();
我有服务提供商:
class ServiceProvider implements ServiceProviderInterface
{
public function register(Application $app) {
foreach ($app as $key => $val) {
if ($key == 'testme') {
throw new Exception('it works!');
}
}
}
}
class ServiceProvider implements ServiceProviderInterface{
public function register(Application $app) {
$app['configure.interface'] = function() use ($app) {
foreach ($app as $val) {
if ($val instanceOf 'MyInterface') {
$val->configureInterfaceMethod($app['param1'], $app['param2'] /*, ...*/);
}
}
}
}
public function boot(Application $app) {
$app['configure.interface'];
}
}
不应该抛出第一个异常,但我希望触发第二个异常
为什么上述方法不起作用?根据MyAwareInterface的$app[…]instanceof MyAwareInterface,silex中的哪一个地方可以将配置注入接口?您的示例更新为silex的IOC,我对接口注入知之甚少:
$app = new Silex\Application();
$app->register(
new ServiceProvider($app)
);
$app['testme'] = function() {
return new ThisObjectImplementsMyInterface();
};
$app->run();
我有服务提供商:
class ServiceProvider implements ServiceProviderInterface
{
public function register(Application $app) {
foreach ($app as $key => $val) {
if ($key == 'testme') {
throw new Exception('it works!');
}
}
}
}
class ServiceProvider implements ServiceProviderInterface{
public function register(Application $app) {
$app['configure.interface'] = function() use ($app) {
foreach ($app as $val) {
if ($val instanceOf 'MyInterface') {
$val->configureInterfaceMethod($app['param1'], $app['param2'] /*, ...*/);
}
}
}
}
public function boot(Application $app) {
$app['configure.interface'];
}
}
我不太明白你的问题以及你想要达到的目的,所以我只想给你留下一条评论,解释一下为什么你的代码不起作用。您试图将代码$app中的Pimple作为数组循环,这是不可能的,因为Pimple只实现ArrayAccess。如果您需要这样的功能,您可以扩展Pimple并实现迭代器或迭代器聚合。此外,您还需要处理订单,请放置$app['testme']。。。第一然后服务提供商可以访问$app['testme']@ivoba不确定您的意思,但是对象/服务是通过回调延迟加载的,因此顺序相当不重要。@danfromread$app->register将直接执行,调用$Provider->register,因此顺序在这里是相关的。引用文档:在与提供商交互时,你需要注意你做某些事情的顺序。我将testme设置为什么并不重要,这只是一个例子。您的回答如何显示在Silex或how@DanFromGermany您的需求还不清楚,我只是用一个解释接口注入的示例更新了我的答案。感谢您提供更多代码。foreach$app as$val{此点不起作用,因为Silex\Application不可遍历。