在 Zend Framework2 中添加新路由
Adding a new route in Zend Framework2
我想向我的 ZF2 应用程序添加一条新路线 (link),如下所示:
mysite.com/somename/?invitecode=12345
请注意 /somename/ 不应该是控制器,而只是 link 中的一个名称,用于跟踪目的。我想我可以通过添加一个新控制器来做到这一点,但由于这个名称将是动态的,我不能为此使用控制器。我在 module.config.php 文件中找到了这个:
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
出于测试目的,我尝试在此处添加这样的路径:
'application/index/indextest' => __DIR__ . '/../view/application/index/index.phtml',
我试过像这样访问 URL:
mysite.com/index/indextest
但是我可以访问这个 link 的唯一方法是在控制器中添加一个动作,如下所示:
public function indextestAction()
{
return $this->redirect()->toUrl("/");
}
请注意:
mysite.com/THISNAMEHERE/?invitecode=12345
请注意 THISNAMEHERE 是动态的,并且会根据我的虚拟主机配置文件中的内容而有所不同。
我应该在这里做什么?有人可以帮我解决这个问题吗?
编辑:
伙计们,到目前为止我已经完成了以下操作,我添加了一个名为 "InviteController" 的新控制器,它执行以下检查:
public function indexAction()
{
if(!empty(htmlspecialchars($_GET["inviter"])))
{
return $this->redirect()->toUrl("/user/emailsignup");
}
}
我已将控制器添加到可调用列表中,如下所示:
'Application\Controller\Invite' => 'Application\Controller\InviteController',
在我的 module.config.php 文件中:
'invite' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/invite/',
'defaults' => array(
'controller' => 'Application\Controller\Invite',
'action' => 'index',
),
),
),
所以现在当我尝试访问 URL 时,它如下所示:
mysite.com/**invite**/?inviter=12345
然而这仍然不是我想要的...我需要这个粗体部分 (INVITE) 是动态的。基本上,如果我从不同的虚拟主机访问应用程序,它会是这样的:
mysite.com/vhost1name/?inviter=1234
而且我仍然希望它在该控制器中调用 InviteController 和 Index 操作。
编辑#2:终于解决了!感谢@Wilt 的 link 和解释! :)
以防万一有人想知道,这是解决方案:
'application' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
'controller' => 'Application\Controller\Invite',
'action' => 'index',
),
),
),
),
您的 ZF2 应用程序的路由已在您的路由器配置中配置。 ZF2 模块的路由器配置通常存储在模块 config
文件夹内的 module.config.php
文件中:
/module/MyModuleName/config/module.config.php
路由器配置如下所示:
// This is your router config
'router' => array(
'routes' => array(
// config goes here
),
),
您可以在 ZF2 文档章节 Routing and controllers
中阅读更多关于路由的信息
你在问题中提到的是 view_manager
配置而不是 router
配置。
如果您不熟悉路由和路由器配置等基本概念,我强烈建议您先学习教程以了解这些基础知识,然后再开发自己的应用程序。 ZF2 tutorial skeleton application (also known as the album application) 是一个很好的起点。遵循教程中的步骤将帮助您实现您想要的。
我想向我的 ZF2 应用程序添加一条新路线 (link),如下所示:
mysite.com/somename/?invitecode=12345
请注意 /somename/ 不应该是控制器,而只是 link 中的一个名称,用于跟踪目的。我想我可以通过添加一个新控制器来做到这一点,但由于这个名称将是动态的,我不能为此使用控制器。我在 module.config.php 文件中找到了这个:
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'not_found_template' => 'error/404',
'exception_template' => 'error/index',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
'error/404' => __DIR__ . '/../view/error/404.phtml',
'error/index' => __DIR__ . '/../view/error/index.phtml',
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
出于测试目的,我尝试在此处添加这样的路径:
'application/index/indextest' => __DIR__ . '/../view/application/index/index.phtml',
我试过像这样访问 URL:
mysite.com/index/indextest
但是我可以访问这个 link 的唯一方法是在控制器中添加一个动作,如下所示:
public function indextestAction()
{
return $this->redirect()->toUrl("/");
}
请注意:
mysite.com/THISNAMEHERE/?invitecode=12345
请注意 THISNAMEHERE 是动态的,并且会根据我的虚拟主机配置文件中的内容而有所不同。
我应该在这里做什么?有人可以帮我解决这个问题吗?
编辑:
伙计们,到目前为止我已经完成了以下操作,我添加了一个名为 "InviteController" 的新控制器,它执行以下检查:
public function indexAction()
{
if(!empty(htmlspecialchars($_GET["inviter"])))
{
return $this->redirect()->toUrl("/user/emailsignup");
}
}
我已将控制器添加到可调用列表中,如下所示:
'Application\Controller\Invite' => 'Application\Controller\InviteController',
在我的 module.config.php 文件中:
'invite' => array(
'type' => 'Zend\Mvc\Router\Http\Literal',
'options' => array(
'route' => '/invite/',
'defaults' => array(
'controller' => 'Application\Controller\Invite',
'action' => 'index',
),
),
),
所以现在当我尝试访问 URL 时,它如下所示:
mysite.com/**invite**/?inviter=12345
然而这仍然不是我想要的...我需要这个粗体部分 (INVITE) 是动态的。基本上,如果我从不同的虚拟主机访问应用程序,它会是这样的:
mysite.com/vhost1name/?inviter=1234
而且我仍然希望它在该控制器中调用 InviteController 和 Index 操作。
编辑#2:终于解决了!感谢@Wilt 的 link 和解释! :)
以防万一有人想知道,这是解决方案:
'application' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
'__NAMESPACE__' => 'Application\Controller',
'controller' => 'Index',
'action' => 'index',
),
),
'may_terminate' => true,
'child_routes' => array(
'default' => array(
'type' => 'Segment',
'options' => array(
'route' => '/[:controller[/:action]]',
'constraints' => array(
'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
),
'defaults' => array(
'controller' => 'Application\Controller\Invite',
'action' => 'index',
),
),
),
),
您的 ZF2 应用程序的路由已在您的路由器配置中配置。 ZF2 模块的路由器配置通常存储在模块 config
文件夹内的 module.config.php
文件中:
/module/MyModuleName/config/module.config.php
路由器配置如下所示:
// This is your router config
'router' => array(
'routes' => array(
// config goes here
),
),
您可以在 ZF2 文档章节 Routing and controllers
中阅读更多关于路由的信息你在问题中提到的是 view_manager
配置而不是 router
配置。
如果您不熟悉路由和路由器配置等基本概念,我强烈建议您先学习教程以了解这些基础知识,然后再开发自己的应用程序。 ZF2 tutorial skeleton application (also known as the album application) 是一个很好的起点。遵循教程中的步骤将帮助您实现您想要的。