2013-11-04 61 views
0

我最近写了一篇关于request forwarding in Silex的文章,它使用博客示例来解释Silex中的子请求。Silex:路由变量赋值问题

我对域控制器使用此示例的稍微修改后的版本。 域端点的路径= /产品/域

域也可以附加一个虚拟主机软件包。 此端点的url路径为/ product/domain /(id)/ webhosting/

您可以使用url路径获取有关webhosting包的信息。 此端点的url路径为/ product/domain /(id)/ webhosting /(id)

要处理这些子请求,我有一个名为forwardRequest的方法,它的方法签名中没有参数,但使用func_get_args来保持它的动态。

不幸的是,这不起作用,因为Silex使用路线中的命名参数来调用您的方法。所以如果你有/ product/domain/domain_id/webhosting/webhosting_id,你的方法应该有方法的签名($ domain_id,$ webhosting_id),如果你想通过一种方法转发多个端点,这是一个PITA。如果您有其他/产品/域/ domain_id/emailhosting和/ product/domain/domain_id/dns端点,则必须为每个转发请求创建一个方法。

有没有人有一个解决方案,我可以只使用1方法转发所有这些子请求?

注意:我使用PHP 5.3。

回答

2

决定将哪些参数传递给控制器​​的部分是所谓的“控制器解析器”。默认的控制器解析器使用反射。尽管如此,您可以使用自定义实现覆盖controller_resolver服务。

定义封装了现有的一个,但具有单个一个替换的参数,请求定制控制器解析器:

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface; 

class RequestArgumentControllerResolver implements ControllerResolverInterface 
{ 
    protected $resolver; 

    public function __construct(ControllerResolverInterface $resolver) 
    { 
     $this->resolver = $resolver; 
    } 

    public function getController(Request $request) 
    { 
     return $this->resolver->getController($request, $controller); 
    } 

    public function getArguments(Request $request, $controller) 
    { 
     return [$request]; 
    } 
} 

扩展现有的控制器分解器与所述新定义的装饰:

$app['controller_resolver'] = $app->share($app->extend('controller_resolver', function ($resolver, $app) { 
    return new RequestArgumentControllerResolver($resolver); 
})); 

注意:这只是一种做法。您不必装饰,如果您愿意,也可以完全替换解析器。很明显,这只是一个将简单的参数传递给控制器​​的非常基本的例子,你可以做更复杂的事情。

+0

谢谢,这个例子指出我在正确的方向,并帮助解决我的问题。 –