gpt4 book ai didi

php - 使用前缀和 Zend_Controller_Router_Route

转载 作者:IT王子 更新时间:2023-10-29 00:06:16 26 4
gpt4 key购买 nike

在现有的 Zend Framework 网站上, Controller 很少且没有模块,我需要为默认路由添加一些前缀。

例如,我目前有:

/products
/products/id/1
/training
/commonpage

我想添加一个产品线级别,而不是在 x 模块中复制我的 Controller (我将只使用 _getParam 在我的 Controller 中请求正确的产品线)。

所以我的新路径将是:

/line1/products
/line1/products/id/1
/line2/training
/commonpage

到目前为止我尝试的是这条路线(位于我的 Bootstrap 文件中):

protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('productLineRoute', new Zend_Controller_Router_Route(
':line/:controller/:action',
array('module' => 'default'),
array('line' => '(' . implode('|', Zend_Registry::getInstance()->constants->lines) . ')')
));
}

但没有任何成功(它给了我一个 404)。在这些条件下,如何构建匹配所有 uri 的单一路由:

  • uri 的前缀与我的产品线数组中的值匹配
  • 仅当允许以“产品线方式”访问所请求的 Controller 时,该路由才有效 - 例如,通过包含我的 Controller 名称的数组

更新

好吧,我设法非常接近我想用这段代码做什么:

protected function _initConstants()
{
$registry = Zend_Registry::getInstance();
$registry->constants = new Zend_Config( $this->getApplication()->getOption('constants') );
$uri = ltrim($_SERVER['REQUEST_URI'], '/');
$product_line = substr($uri, 0, strpos($uri, '/'));
if(!empty($product_line) && in_array($product_line, Zend_Registry::getInstance()->constants->lines->toArray()) &&
$product_line != Zend_Registry::getInstance()->constants->lines->get(0)) {
$registry->product_line = $product_line;
} elseif(!isset($registry->gamme)) {
$registry->product_line = Zend_Registry::getInstance()->constants->lines->get(0);
}
}

protected function _initRoutes()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$registry = Zend_Registry::getInstance();
$router->addRoute('productLineRoute', new Zend_Controller_Router_Route(
':line/:controller/:action/*',
array(
'module' => 'default', 'action' => 'index',
'line' => (isset($registry->product_line)) ? $registry->product_line : Zend_Registry::getInstance()->constants->lines->get(0)
),
array(
'line' => '(' . implode('|', Zend_Registry::getInstance()->constants->lines->toArray()) . ')',
'controller' => '(' . implode('|', array('products', 'training')) . ')'
)
));
}

有了它,我可以访问 /line1/products 但不能访问 /line1/commonpage,这正是我想要的 - 所以 Controller 约束工作得很好。如您所见,我在 Zend Registry 中添加了产品线名称,因此当我在模板中使用 URL View Helper 时它会被保存(这样我就不必编辑所有模板以在我的帮助器中添加产品线参数电话)。

我现在遇到的问题是这个助手:似乎我的 Controller 约束被忽略了。当我在我的模板中这样做时:

<a href="<?php echo $this->url(array('controller'=> 'commonpage', 'action'=>'index'),null, true) ; ?>">My link</a>

我最终得到了这个:

<a href="/line1/commonpage">My link</a>

因此添加了产品线,尽管我的路线的 Controller 约束不允许这样做。

最佳答案

好的,我找到了一个解决方案:我更改了 URL Helper 以在其中添加 Controller 约束。如果 Controller 与“产品线 Controller ”数组不匹配,它会强制 assemble 使用默认路由(不完美,但对我有用):

public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true, $default = false)
{
$router = Zend_Controller_Front::getInstance()->getRouter();
if(isset($urlOptions['controller']) && !in_array($urlOptions['controller'], array('products', 'training'))) {
$name = 'default';
}
return $router->assemble($urlOptions, $name, $reset, $encode);
}

关于php - 使用前缀和 Zend_Controller_Router_Route,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30049936/

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