【问题标题】:How to route the URI with parameters to a method in codeigniter?如何将带有参数的URI路由到codeigniter中的方法?
【发布时间】:2015-07-29 05:08:59
【问题描述】:

我对 codeigniter 中的路由概念了解不多,我想将许多参数传递给单个方法,如 http://www.codeigniter.com/userguide2/general/controllers.html 教程页面中所述。

在网址里我有这个

http://localhost/code_igniter/products/display/2/3/4

在我的 routes.php 中我写了

$route['products/display/(:any)'] = 'Products_controller/display';

我认为它会自动将所有参数(此处为 2/3/4)传递给方法“显示”,但我收到 404 page not found 错误。

一般来说,如果 URI 是 controller/method,我想实现类似的目标,我想路由到 someother_controller/its_method 并将参数(如果有)传递给该方法。我该怎么做?

【问题讨论】:

  • 您使用的是什么版本的 codeigniter 也可以在这里找到 codeigniter 文档的新位置。 codeigniter.com/docs
  • codeigniter 3.0 我想将这些参数传递给显示方法,请您帮帮我!
  • 您是否确定了控制器文件名 Products_controller.php 并在路由上尝试使用小写 $route['products/display/(:any)'] = 'products_controller/display/$1';
  • 你最好看看codeigniter 3 uri routing codeigniter.com/user_guide/general/routing.html
  • 感谢 wolfgang1983,正如你所说,我已将文件命名为“Products_controller”并在 routes.php 中使用小写字母,Suvash 的回答也很好!但是如果我错过了任何一个参数,我会再次得到 404 not found。如何编写可以传递所有参数的路由规则,即使我错过了其中一个参数?在这种情况下,我想将默认值(例如 0)传递给该参数。我该怎么做?

标签: php codeigniter


【解决方案1】:

在 CI 3.x 中,(:any) 参数仅匹配单个 URI 段。比如:

$route['method/(:any)/(:any)'] = 'controller/method/$1/$2';

将完全匹配两个段并适当地传递它们。如果你想匹配 1 或 2,你可以这样做(按顺序):

$route['method/(:any)/(:any)'] = 'controller/method/$1/$2';
$route['method/(:any)'] = 'controller/method/$1';

您可以使用 (.+) 参数传递多个段,如下所示:

$route['method/(.+)'] = 'controller/method/$1';

在这种情况下,$1 将包含所有过去的方法/。一般来说,我认为不鼓励使用它,因为您应该知道正在传递的内容并适当地处理它,但有时 (.+) 会派上用场。例如,如果您不知道传递了多少参数,这将允许您捕获所有参数。另请记住,您可以像这样在方法中设置默认参数:

public function method($param=''){}

因此,如果没有传递任何内容,您仍然有一个有效值。

你也可以像这样传递给你的索引方法:

$route['method/(:any)/(:any)'] = 'controller/method/index/$1/$2';
$route['method/(:any)'] = 'controller/method/index/$1';

显然,这些只是示例。您还可以包含文件夹和更复杂的路由,但这应该可以帮助您入门。

【讨论】:

  • 非常感谢 greco.roamin 您的帖子也帮助了我! routes.php 中的顺序是否重要? $route['方法/(:any)/(:any)'] = '控制器/方法/$1/$2'; $route['method/(:any)'] = '控制器/方法/$1';或 $route['method/(:any)'] = '控制器/方法/$1'; $route['method/(:any)/(:any)'] = 'controller/method/$1/$2 哪一个是正确的?
  • 不客气。是的,顺序很重要。从 CI 文档中,“路由将按照定义的顺序运行。较高的路由将始终优先于较低的路由。”
  • 如何访问控制器中的变量?我尝试使用 ($id = null) { print_r($id); print_r($_GET);死();但两者都没有返回任何值
  • @guradio 如果您的意思是如何访问控制器中的 $1、$2 等变量,您需要在传入的参数中为它们命名。例如,如果您的路线类似于 someMethod/$1,那么在您的控制器中,您的 someMethod 方法需要一个参数来“捕捉”它,例如:someMethod($id)。然后在 someMethod 中你可以访问 $id 这将是一个字符串。
【解决方案2】:

在 codeigniter 3 上

确保你的控制器文件名和类名的首字母大写

应用程序 > 控制器 > Products_controller.php

<?php

class Products_controller extends CI_Controller {

    public function index() {

    }

    public function display() {

    }
}

在路线上

$route['products/display'] = 'products_controller/display';
$route['products/display/(:any)'] = 'products_controller/display/$1';
$route['products/display/(:any)/(:any)'] = 'products_controller/display/$1/$2';
$route['products/display/(:any)/(:any)/(:any)'] = 'products_controller/display/$1/$2/3';

Codeigniter 3 和 2 的文档

http://www.codeigniter.com/docs

【讨论】:

  • 非常感谢你们的帮助! Wolfgang1983 感谢您的链接,我再次感谢大家。它有效!
  • 如何访问控制器中的变量?我尝试使用 ($id = null) { print_r($id); print_r($_GET);死();但两者都没有返回任何值
【解决方案3】:

像这样维护你的路由规则

$route['products/display/(:any)/(:any)/(:any)'] = 'Products_controller/display/$2/$3/$4';

请查看此链接Codeigniter URI Routing

【讨论】:

  • 是的,谢谢 Suvash 我这样做了,效果很好,但是如果我在 URI 中没有参数怎么办?在这种情况下,我想将默认值传递给该参数!说最后一个($ 4)丢失,我得到 404 ,但如果我有它,那么它工作得很好。很明显,即使不知道 URI 中有多少参数,我该如何路由?
  • 然后你可以使用正则表达式来定义你的路由规则。请查看此链接codeigniter.com/userguide3/general/routing.html
【解决方案4】:

在 CodeIgniter 4 中

考虑使用带有 id 作为参数的 Show 方法的产品控制器

http://www.example.com

/product/1

ROUTE 定义应该是

$routes->get("product/(:any)", "Com\Atoconn\Product::show/$1");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    相关资源
    最近更新 更多