2014-04-03 20 views
1

我們有一個建立表單的系統。表單元素的每個原型都是它自己的類,作爲ZF2的MVC中的一個模型。樹結構的類以及遍歷結構的每個類都將自己的HTML添加到總結果中。我知道這打破了MVC,但到目前爲止,這是一個自包含系統,運行良好。但一個問題是,我們希望能夠像路線名稱和參數那樣在其他控制器中從路由轉換爲URL。如何將路線轉換爲模型中的網址?

到目前爲止,我發現的唯一選擇是重構此代碼以符合MVC,並通過視圖渲染器推送所有html。有誰知道一些可以讓我們將路由轉換爲控制器或模型之外的URL的替代方法嗎?


我會試着解釋一下這個結構,而不會在這裏拋出一堆代碼。

abstract class Element 
{ 
    /** 
    * Each concrete element must create its own html 
    */ 
    abstract public function processHtml(); 

    public function addChild(Element $element) 
    { 
    } 
} 

某些元素可以容納其他元素。所以它從一個根元素構建一個樹結構。然後在根上調用processHtml()開始遞歸到樹中。

public function processHtml() 
{ 
    $html = '<div>'; 

    foreach($this->children as $element) 
    { 
     $html .= $element->processHtml(); 
    } 

    $html .= '</div>'; 
    return $html; 
} 
+0

路由器可以爲給定的路由名稱返回一個路徑,所以聽起來好像你需要通過這個路徑來傳遞它。雖然沒有更多的信息/代碼,但很難知道如何將它應用於你的情況。 –

+0

@TimFountain更新了一些代碼片段來解釋它的結構。 – Chris

+0

你的表單是否擴展'Element',或者是以其他方式添加到表單的元素? –

回答

2

短版本:$router = $serviceLocator->get('Router');

public function processHtml(ServiceLocatorInterface $serviceLocator) 
{ 
    $router = $serviceLocator->get('Router'); 
    $url = $router->assemble($this->Params, array('name' => $this->Route)); 

    $html = "<a href='$url' target='_blank'>{$this->Label}</a>"; 
    return $html; 
} 

如何我發現它,萬一它有助於任何人:

的Zend \查看\助手\地址:: __調用 return $this->router->assemble($params, $options);

還在該網址助手:

public function setRouter(RouteStackInterface $router) 
{ 
    $this->router = $router; 
    return $this; 
} 

RouteStackInterface延伸RouteInterface

所以,我所經歷的的Zend \的mvc \應用挖掘和應用發現->setRouter($serviceManager->get('Router')); ::自舉()