我正在构建我的第一个Zend Framework应用程序,我想找出从URL获取用户参数的最佳方法。
我有一些控制器具有index
,add
,edit
和delete
操作方法。 index
操作可以采用page
参数,edit
和delete
操作可以采用id
参数。
Examples
http://example.com/somecontroller/index/page/1
http://example.com/someController/edit/id/1
http://example.com/otherController/delete/id/1
到目前为止,我在动作方法中获取了这些参数:
class somecontroller extends Zend_Controller_Action
{
public function indexAction()
{
$page = $this->getRequest->getParam('page');
}
}
然而,一位同事告诉我使用Zend_Controller_Router_Rewrite的更优雅的解决方案如下:
$router = Zend_Controller_Front::getInstance()->getRouter();
$route = new Zend_Controller_Router_Route(
'somecontroller/index/:page',
array(
'controller' => 'somecontroller',
'action' => 'index'
),
array(
'page' => '\d+'
)
);
$router->addRoute($route);
这意味着对于每个控制器,我需要添加至少三个路径:
请参阅下面的代码作为示例。这些是一个控制器只有3个基本动作方法的路径,想象有10个或更多控制器......我无法想象这是最好的解决方案。我看到的唯一好处是参数键已命名,因此可以从URL中省略(somecontroller/index/page/1
变为somecontroller/index/1
)
// Route for somecontroller::indexAction()
$route = new Zend_Controller_Router_Route(
'somecontroller/index/:page',
array(
'controller' => 'somecontroller',
'action' => 'index'
),
array(
'page' => '\d+'
)
);
$router->addRoute($route);
// Route for somecontroller::editAction()
$route = new Zend_Controller_Router_Route(
'somecontroller/edit/:id',
array(
'controller' => 'somecontroller',
'action' => 'edit'
),
array(
'id' => '\d+'
)
$router->addRoute($route);
// Route for somecontroller::deleteAction()
$route = new Zend_Controller_Router_Route(
'somecontroller/delete/:id',
array(
'controller' => 'somecontroller',
'action' => 'delete'
),
array(
'id' => '\d+'
)
$router->addRoute($route);
答案 0 :(得分:2)
我倾向于这样看:
确定处理要求。
每个“行动”需要什么?编辑操作和删除操作可能需要:id参数。添加操作和列表操作可能不会。然后,这些控制器/操作使用参数并进行处理。
注意:您可以编写这些控制器/操作,而无需参考将访问者带到那里的网址。这些行动只是希望将他们的参数传递给他们。
决定(!)您想要的网址。
一般情况下,我发现网址的(/:module/):controller/:action
部分工作正常(除了/about
这样的顶级相对静态页面,我经常将这些操作放在IndexController上(或者一个静态控制器)并且必须在网址中包含/index
前缀。
因此,要处理帖子,您可能需要以下网址:
/post
- 列出所有帖子,可能包含一些分页/post/:id
- 显示特定帖子/post/:id/edit
- 编辑特定帖子/post/:id/delete
- 删除特定帖子/post/add
- 添加帖子或者,您可能需要:
/post/list
- 列出所有帖子,可能包含一些分页/post/display/:id
- 显示特定帖子/post/edit/:id
- 编辑特定帖子/post/delete/:id
- 删除特定帖子/post/add
- 添加帖子或任何其他网址方案。关键是,您决定要公开的网址。
创建路线......
...将这些网址映射到控制器/操作。 [并确保无论何时渲染它们,都将url()
view-helper与route-name一起使用,以便路由更改不需要更改操作或视图中的下游代码。
你最终用这种方式写了更多的路线吗?是的,我发现我做到了。但是,对我来说,好处是我可以决定我的网址。我没有坚持使用Zend默认值。
但是,和大多数事情一样,YMMV。
答案 1 :(得分:1)
这完全取决于您的确切要求。如果您只想传递一个或两个参数,第一种方法将是最简单的方法。为每个动作定义路线是不切实际的。您想要定义路线的几种情况是:
以博客为例,您可能希望为博客帖子网址定义路由,以便网址对SEO友好。同时,您可能希望保留编辑/删除/发表评论等网址以保持ZF默认值并使用$ this-> getRequest-> getParam()来访问该上下文中的请求参数。
总而言之,优雅的解决方案将是路由和默认网址模式的组合。
答案 2 :(得分:0)
在之前的回答@ janenz00中提到“长网址”是使用路线的原因之一:
长网址 - 如果特定操作的参数列表很长,您可能需要定义路由,以便省略请求中的密钥,从而缩短网址。
假设我们有一个employee
控制器,其index
动作显示员工表,其中包含每位员工的一些额外数据(如年龄,部门......)。 index
操作可以采用以下参数:
page
参数(必填)sortby
参数(可选),它采用一个列名进行排序(例如年龄)dept
参数(可选),它带有一个部门的名称,只显示在该部门工作的员工我们添加以下路线。请注意,在使用此路由时,我们无法在未指定dept
参数的情况下指定sortby
参数。
$route = new Zend_Controller_Router_Route(
'employee/index/:page/:sortby/:dept',
array(
'controller' => 'employee',
'action' => 'index')
);
如果我们在操作方法中获取这些参数,我们可以避免这个问题(因为参数键在url中指定):
http://example.com/employee/index/page/1/dept/staff
我可能会以错误的方式看待它(或者可能看不到路由的全部潜力),但对我来说,使用路由的唯一两个原因是:
/module/controller/action
模式如果您使用路由的唯一原因是使用命名参数,那么我认为最好在您的操作方法中获取这些参数,原因有两个:
欢迎任何有关此主题的想法或建议!