我只是Zend的新手,我对Zend路由器有点麻烦。我搜索了它,但没有发现...Zend控制器路由器:定义变量以指向一个控制器中的不同动作
我想能够定义一个路由器为每个定义的变量在uri级别指向一个控制器中的不同动作。
我与郎和模块,所以我在系统启动的应用程序定义的下一个initRoutes功能工作:
protected function _initRoutes()
{
$front = Zend_Controller_Front::getInstance();
$router = $front->getRouter();
$defaultRoute = new Zend_Controller_Router_Route(
':lang/:module/:controller/:action',
array(
'lang' => 'es',
'module' => 'default',
'controller' => 'index',
'action' => 'index'
),
array(
'lang' => '^(en|es)$',
'module' => '^(default|admin)$'
)
);
$router->addRoute('defaultRoute', $defaultRoute);
return $router;
}
我希望能够通过自己定义的操作来访问论坛板块和论坛主题。
喜欢的东西:
MYDOMAIN /论坛 - >论坛/指数
MYDOMAIN /论坛/节 - >论坛/ sectionAction
MYDOMAIN /论坛/节/话题 - > forum/topicAction
还有lang和modul向在URI级别等来定义:
MYDOMAIN /郎/模块/论坛
MYDOMAIN /郎/模块/论坛/部分
MYDOMAIN /郎/模块/论坛/部分/话题
所以我有这样的:
class ForumController extends Zend_Controller_Action
{
public function indexAction()
{
}
public function sectionAction()
{
}
public function topicAction()
{
}
然后,我创建的下一个路由Default_Bootstrap内:
$forumRoutes = new Zend_Controller_Router_Route(
':lang/:module/forum',
array(
'lang' => 'es',
'module' => 'default',
'controller' => 'forum',
'action' => 'index'
)
);
$sectionRoutes = new Zend_Controller_Router_Route(
':lang/:module/forum/:section',
array(
'lang' => 'es',
'module' => 'default',
'controller' => 'forum',
'action' => 'section',
'section' => ''
)
);
$topic = new Zend_Controller_Router_Route(
':lang/:module/forum/:section/:topic',
array(
'lang' => 'es',
'module' => 'default',
'controller' => 'forum',
'action' => 'topic',
'section' => '',
'topic' => ''
)
);
$router->addRoute('forumTopics', $topic);
$router->addRoute('forumSections', $section);
$router->addRoute('forum', $forumRoutes);
现在,这只能如果我定义了郎和URI层次的模块,但如果我喜欢=> MYDOMAIN /论坛定义不起作用/ section |部分/主题。这也为我的导航 - >菜单带来了另一个问题。如果我在路由器定义中将“forum”定义为静态变量,那么当我将鼠标悬停在navigatoin.xml中定义的任何标签上时,uri级别对于其中的每个标签都具有相同的值。
我试图做一个链条是这样的:
$forumRoutes = new Zend_Controller_Router_Route(
':lang/:module/forum',
array(
'lang' => 'es',
'module' => 'default',
'controller' => 'forum',
'action' => 'index'
)
);
$section = new Zend_Controller_Router_Route(
':section',
array(
'action' => 'section',
'section' => ''
)
)
$topic = new Zend_Controller_Router_Route(
':topic',
array(
'action' => 'topic',
'topic' => ''
)
)
$chainedRoute = new Zend_Controller_Router_Route_Chain();
$chainedRoute->chain($topic)
->chain($section)
->chain($forumRoutes);
$router->addRoute($chainedRoute);
但正如我所料,这并不工作。
任何帮助,将不胜感激,谢谢。
哦,我看到了,谢谢你的回复,但我想要做的事情是:取决于URI上有多少个参数,我将使用Controller_Action进行渲染。所以我可以在路由器级别定义,如果论坛控制器得到的第一个参数将用“sectionAction”渲染,如果我有两个参数,我将使用“topicAction”渲染,我只需要做一些事情,比如'public function sectionAction(){$ section = $ this - > _ request-> getParam('section'); // @ TODO:从Db获取并呈现}'这可以通过Zend_Controller_Router完成吗? – Ramiro 2012-08-15 19:38:50
我在codeIgniter中做了这样的事情,在路由配置上我设置了一个像'$ routes ['forum /(az)'] ='forum/section''这样的数组,并且匹配第二个参数只需添加一个新的路由器过滤器例如:'$ routes ['forum /(az)/(az)'] ='forum/topic''这可能与Zend Routers相匹配吗?像重定向,但只获取uri参数并重定向到所需的操作。 – Ramiro 2012-08-15 20:06:43
Codeigniter使用基于段的检查,而zend检查请求!所以没有'segment'这样的东西,但是,使用Request-Param获取东西...在这里,正如我所提到的,您将不得不重新计划应用程序......动作来自控制器...示例,用户控制器可以查看,添加,修改,删除..路线用于例如路线 - “我的仪表板”路由到用户控制器 - 工具和选项操作...很酷? – Karma 2012-08-15 21:27:44