Php Silex ControllerCollection未级联-调用其他ControllerCollection
本周,我在使用Silex、Routes和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.
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);
}
}