0

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

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

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

您可以使用 url 路径获取有关虚拟主机包的信息。此端点的 url 路径将是 /product/domain/(id)/webhosting/(id)

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

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

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

注意:我使用的是 PHP 5.3。

4

1 回答 1

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 传递给控制器​​,你可以做一些更复杂的事情。

于 2013-11-04T12:11:18.383 回答