Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Silex界面注入_Php_Dependency Injection_Silex_Interface Injection - Fatal编程技术网

Php Silex界面注入

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(); 我有服务

我正在尝试使用Silex\Application实现接口注入。 我在一个PHP文件中进行了引导,请记住,这在没有接口的情况下得到了简化:

$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不可遍历。