我们有一个建筑形式的系统。表单元素的每个原型都是它自己的类,作为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 :(得分: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 \ View \ Helper \ Url :: __调用
return $this->router->assemble($params, $options);
还在Url Helper:
public function setRouter(RouteStackInterface $router)
{
$this->router = $router;
return $this;
}
RouteStackInterface 扩展 RouteInterface
所以,我开始深入研究 Zend \ Mvc \ Application ,并在 Application :: bootstrap()
中找到->setRouter($serviceManager->get('Router'));