2012-11-15 134 views
4

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

我有一些控制器有index,add,editdelete的操作方法。 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); 

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

  • 一个用于与该“指数”行动:页面参数
  • 一个用于与“编辑”行为: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); 

回答

2

我倾向于看它是这样的:

  1. 确定处理要求。

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

    注意:您可以在没有任何参考的情况下编写这些控制器/操作,将访问者带到那里。这些行动只是期望他们的参数能够传递给他们。

  2. 决定(!)你想要什么网址。

    在一般情况下,我找到URL的的(/:module/):controller/:action部分主要是工作正常(除了像​​,在那里我经常把动作上的索引控制器(或StaticController顶级相对静态网页)和怨恨有。包括在URL中/index前缀

    因此,要处理的职位,你可能要像URL:

    • /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方案。关键是,你决定你想要公开的网址。

  3. 创建路线...

    ...映射这些URL到控制器/行动。 [并且确保每次渲染它们时,都使用url()视图助手和路由名称,以便路由更改不需要更改您的操作或视图中的下游代码。

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

但是,与大多数情况一样,YMMV。

+0

我看到您的第一个url结构有问题。你说“'/ post' url列出了所有的帖子,可能有一些**分页**”。这意味着我们需要传递一个页面参数:'/ post /:page'。另一方面,'/ post' url也需要一个获取单个记录的方法,如下所示:'/ post /:id'。我们如何知道用户是否指定了页面ID或recrd ID? –

+0

我倾向于通过querystring传递参数params,而不一定是路由路径的一部分。 –

1

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

  1. 长的URL - 如果参数列表特定动作很长,您可能希望定义一个路由,这样就可以省略从按键请求并因此缩短网址。
  2. Fancy urls - 如果您想要偏离Zend Framework的正常控制器/动作url模式,并为您的应用程序定义不同的url模式(例如,以“.html”结尾)
  3. S// SEO friendly网址

以博客为例,您可能需要定义博客帖子的路径,以便该网址易于搜索引擎优化。同时,您可能希望保留edit/delete/post comment等url以保持ZF默认值,并使用$ this-> getRequest-> getParam()来访问该上下文中的请求参数。

总之,一个优雅的解决方案将是路由和默认的url模式的组合。

0

在前面的回答@ janenz00提到的“长URL”的原因之一使用路线:

长的URL - 如果参数列表特定动作很长,你可能希望定义一个路由,以便您可以省略请求中的密钥,从而缩短网址。

比方说,我们有一个employee控制器与index行动,显示员工与每个员工的一些附加数据(如年龄,部门...)的表。该index动作可以采取以下参数:

  • 一个page参数(必填)
  • 一个sortby参数(可选),这需要一个列名(如年龄)
  • 一个dept参数(可选排序)以部门名称命名,只显示在该部门工作的员工

我们添加以下路线。请注意,在使用此路线时,如果不先指定参数sortby,则无法指定参数dept

$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图案
  • 如果你想使你的URL的更多搜索引擎友好的

如果您使用的路线的唯一原因是利用命名参数的话,我认为这是更好的动作方法,因为获取这些参数两个原因:

  • 保持路由的数量至少将减少时间和资源路由器
  • 在url中的参数键传递花费的金额允许我们使用更复杂的URL带可选参数。

任何关于这个主题的想法或建议都非常值得欢迎!