2013-11-04 66 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

謝謝,這個例子指出我在正確的方向,並幫助解決我的問題。 –