获取Zend Framework URL参数

时间:2012-11-15 01:36:17

标签: zend-framework zend-route

我正在构建我的第一个Zend Framework应用程序,我想找出从URL获取用户参数的最佳方法。

我有一些控制器具有indexaddeditdelete操作方法。 index操作可以采用page参数,editdelete操作可以采用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);

这意味着对于每个控制器,我需要添加至少三个路径:

  • 一个用于带有:page参数的“index”操作
  • 一个用于带有:id参数
  • 的“编辑”操作
  • 一个用于“删除”操作,其中包含:id参数

请参阅下面的代码作为示例。这些是一个控制器只有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);

3 个答案:

答案 0 :(得分:2)

我倾向于这样看:

  1. 确定处理要求。

    每个“行动”需要什么?编辑操作和删除操作可能需要:id参数。添加操作和列表操作可能不会。然后,这些控制器/操作使用参数并进行处理。

    注意:您可以编写这些控制器/操作,而无需参考将访问者带到那里的网址。这些行动只是希望将他们的参数传递给他们。

  2. 决定(!)您想要的网址。

    一般情况下,我发现网址的(/: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 - 添加帖子

    或任何其他网址方案。关键是,您决定要公开的网址。

  3. 创建路线......

    ...将这些网址映射到控制器/操作。 [并确保无论何时渲染它们,都将url() view-helper与route-name一起使用,以便路由更改不需要更改操作或视图中的下游代码。

    < / LI>

    你最终用这种方式写了更多的路线吗?是的,我发现我做到了。但是,对我来说,好处是我可以决定我的网址。我没有坚持使用Zend默认值。

    但是,和大多数事情一样,YMMV。

答案 1 :(得分:1)

这完全取决于您的确切要求。如果您只想传递一个或两个参数,第一种方法将是最简单的方法。为每个动作定义路线是不切实际的。您想要定义路线的几种情况是:

  1. 长网址 - 如果特定操作的参数列表很长,您可能需要定义路由,以便省略请求中的密钥,从而缩短网址。
  2. 花哨的网址 - 如果你想偏离Zend Framework的普通控制器/动作网址模式,并为你的应用程序定义一个不同的网址模式(例如,以“.html”结尾)
  3. Slugs / SEO友好网址
  4. 以博客为例,您可能希望为博客帖子网址定义路由,以便网址对SEO友好。同时,您可能希望保留编辑/删除/发表评论等网址以保持ZF默认值并使用$ this-&gt; getRequest-&gt; 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模式
  • 如果你想让你的网址更加SEO友好

如果您使用路由的唯一原因是使用命名参数,那么我认为最好在您的操作方法中获取这些参数,原因有两个:

  • 将路由数量保持在最低限度将减少路由器花费的时间和资源
  • 传入网址中的参数键,可以让我们使用带有可选参数的更复杂的网址。

欢迎任何有关此主题的想法或建议!