Silex:路由变量分配问题



我最近写了一篇关于Silex中请求转发的文章,其中使用了一个博客示例来解释Silex中的子请求。

对于域控制器,我使用这个示例的一个稍微修改过的版本。域端点的路径=/product/domain

域还可以附加一个网络托管包。此终结点的url路径为/product/domain/(id(/webhosting/

您可以使用url路径获取有关网络托管包的信息。此终结点的url路径为/product/domain/(id(/webhosting/(id(

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

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

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

注意:我使用的是PHP 5.3。

silex中决定传递给控制器的参数的部分称为"控制器解析器"。默认控制器解析程序使用反射。不过,您可以使用自定义实现覆盖controller_resolver服务。

定义一个自定义控制器解析器,该解析器封装现有的控制器解析器,但将参数替换为单个参数,即请求:

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpKernelControllerControllerResolverInterface;
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];
    }
}

使用新定义的decorator:扩展现有的控制器解析器

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

注意:这只是一种方法。你不必装饰,如果你喜欢,你也可以完全更换解析器。很明显,这只是一个非常基本的例子,只向控制器传递一个arg,你可以做一些更复杂的事情。

最新更新