Php Silex ControllerCollection未级联-调用其他ControllerCollection

Php Silex ControllerCollection未级联-调用其他ControllerCollection,php,symfony,routing,silex,Php,Symfony,Routing,Silex,本周,我在使用Silex、Routes和ControllerCollection课程时遇到了以下问题: 我们正在研究的一些插件将自身连接到对象,并在管理界面中将路由添加到它们的表示。这将导致路线构建看起来像(断开的): 我遇到的问题是,在调用$app['url\u generator']->generate('admin.user.edit',array('id'=>'s2'))时将无法断言用户ID(\d+),调用$app['url\u generator']->generate('admin.

本周,我在使用Silex、Routes和
ControllerCollection
课程时遇到了以下问题:

我们正在研究的一些插件将自身连接到对象,并在管理界面中将路由添加到它们的表示。这将导致路线构建看起来像(断开的):

我遇到的问题是,在调用
$app['url\u generator']->generate('admin.user.edit',array('id'=>'s2'))时
将无法断言用户ID(
\d+
),调用
$app['url\u generator']->generate('admin.User.extension.view',array('ID'=>'s2','extension\u name'=>'something')将不显示。访问它们的URL也可以这样说:
/admin/user/s2
(失败)和
/admin/user/s2/extension/something/
(成功)

同样的行为表现在
之前
之后
转换
以及
需要
[http/s]方法。这是预期的行为吗?从第一次装载到扩展视图,该值可以很好地传输,生成器可以很顺利地处理它,但是
assert
的行为与预期不符


我做错了什么?

问题在于ControllerCollection对
\u call()
的实现。ControllerCollection首先检查是否支持该方法:

    if (!method_exists($this->defaultRoute, $method)) {
        throw new \BadMethodCallException(sprintf('Method "%s::%s" does not exist.', get_class($this->defaultRoute), $method));
    }
然后它将调用级联到它的控制器(毕竟它是控制器的集合):

问题在于
instanceof
检查,该检查不考虑
ControllerCollection
的其他实例。这在web上几乎没有静态,所以我假设这是预期的行为,或者不是许多人的标准过程

修复方法非常简单,只需将ControllerCollection的
| |$controller instanceof
添加到
if
条件,我有两种解决方案可供任何其他期望此行为的人使用:

或者。我们拭目以待

    if (!method_exists($this->defaultRoute, $method)) {
        throw new \BadMethodCallException(sprintf('Method "%s::%s" does not exist.', get_class($this->defaultRoute), $method));
    }
    foreach ($this->controllers as $controller) {
        if ($controller instanceof Controller) {
            call_user_func_array(array($controller, $method), $arguments);
        }
    }