Silex:路由变量赋值问题

时间:2013-11-04 11:47:12

标签: php request silex forwarding

我最近写了一篇关于request forwarding in Silex的帖子,该帖子使用博客示例来解释Silex中的子请求。

我对域控制器使用此示例的略微修改版本。 域端点的路径= / product / domain

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

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

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

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

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

注意:我使用的是PHP 5.3。

1 个答案:

答案 0 :(得分:2)

silex中决定传递给控制器​​的参数的部分称为“控制器解析器”。默认控制器解析器使用反射。您可以使用自定义实现覆盖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);
}));

注意:这只是一种方法。您无需装饰,如果您愿意,也可以完全更换旋转变压器。显然,这只是将一个arg传递给控制器​​的一个非常基本的例子,你可以做一些更复杂的事情。