gpt4 book ai didi

zend-framework - 带动态 URL 参数的 Zend_Navigation

转载 作者:行者123 更新时间:2023-12-04 23:48:13 25 4
gpt4 key购买 nike

我正在努力实现带有动态 URL 参数的 Zend_Navigation 面包屑。

简单场景:想象一个带有 viewAction()CompanyController,它从 URL 中获取一个 id 参数来获取有关特定公司的信息.

URL: example.com/company/view/id/4

Desired breadcrumb: Home > Companies > [ Company name ]

我在网上做了一些研究并提出了以下解决方案:在 predispatch() Hook 中,我从 $_SERVER[ 中获取了 id 参数'REQUEST_URI'](我们不能为此使用请求对象,因为调度尚未开始)并从数据库中获取该记录。然后我简单地将这个页面添加到它在 Zend_Navigation 容器中的根页面。您可以在本文底部看到它的实现。

我发现这种方法的问题是它不可扩展:

  1. 如果每个公司有多个操作怎么办?

    除了查看公司记录外,我们可能还想编辑(example.com/company/edit/id/4 ) 或对其执行其他操作。当然,我们可以创建一个 switch 语句来检查 URL 中的操作,但我觉得这是不可扩展的。

  2. 如果 URL 中有多个动态参数怎么办?

    对于每个公司,我们还需要管理其联系人(公司所有者、财务人员等),因此我们创建了一个ContactsController它还包含一个 viewActioneditAction。由于联系人与公司直接相关,我们希望在 URL 和面包屑中也能体现这一点:

    URL: example.com/company/company-id/4/contacts/contact-id/2

    Desired breadcrumb: Home > Companies > [Company name] > Contacts of [Company name] > [Contact name]

    我们可以很容易地为此设置一条路线。但是现在我们必须从 URL 中获取多个 id。随着 URL 变得越来越复杂,此过程更容易出错。

到目前为止,我提出了两个看似合理的解决方案:

  1. 扩展 Plugin_Navigation::preDispatch() 钩子(Hook)

    一个可能的解决方案是使用详细的 URL 参数(如 company-idcontact-id)。这样我们就可以提取名称(即company)并通过相应的模型类获取记录。

  2. 在我们的操作方法中将页面添加到导航容器

    这将是我认为最灵活的选择,但这也意味着我们不能再从一个中心点管理我们的面包屑,这是一个严重的缺点。

我已经进行了大量研究,但似乎没有针对此问题的现成解决方案。非常感谢任何帮助。

前面提到的Plugin_Navigation::preDispatch()钩子(Hook):

class Plugin_Navigation extends Zend_Controller_Plugin_Abstract
{
public function preDispatch()
{
$view = Zend_Controller_Action_HelperBroker::getExistingHelper('ViewRenderer')->view;
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml','nav');
$container = new Zend_Navigation($config);

$urlParts = explode('/', ltrim($_SERVER['REQUEST_URI'], '/'));
$pos = array_search('id', $urlParts);

if ($pos !== FALSE)
{
$id = $urlParts[$pos + 1];

$model = new Model_Company();
$company = $model->fetchOne($id);

$rootPage = $container->findOneBy('controller', 'company');

$rootPage->addPage(new Zend_Navigation_Page_Mvc(array(
'controller' => 'company',
'action' => 'view',
'label' => $company->name
)));

$view->navigation($container);
}
}
}

有关此主题的一些引用资料:

最佳答案

您可以通过在 bootstrap.php 文件中引导前端 Controller 简单地解决这个问题

在 bootstrap.php 文件中添加:

public function _initRequest()
{
$this->bootstrap('frontController');
$front = $this->getResource('frontController');
$front->setRequest(new Zend_Controller_Request_Http());

$request = $front->getRequest();
}

然后在插件的preDispatch函数中传递请求对象:

class Your_Controller_Plugin_PluginName extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$MyController =$request->getControllerName();
$MyAction =$request->getActionName();
$MyParams =$request->getParams();

//now you can go ahead with implementing your breadcrumb

}
}

关于zend-framework - 带动态 URL 参数的 Zend_Navigation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com