【问题标题】:CodeIgniter routing: Passing parameter before controller and catching it on the default_controllerCodeIgniter 路由:在控制器之前传递参数并在 default_controller 上捕获它
【发布时间】:2014-01-27 21:31:53
【问题描述】:

我正在使用一个网站范围的参数来控制网站的布局。此参数位于 URL 中的任何其他内容之前,然后是通常的 controller/parameters 部分。

mywebsite/{section}/controller/parameter1/parameter2

我可以为每个控制器定义如下所示的路由,但希望避免它,因为 section 参数仅与布局相关,与控制器无关。

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

相反,我希望能够让 default_controller 捕获第一段并将其存储为视图变量或会话/cookie,以便其余控制器可以简单地忽略它。

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

【问题讨论】:

  • 你是说用户点击了包含 {section} 的链接,但最终点击了没有它的链接?
  • 为什么不使用 session 或 cookie 来存储每个用户的 section 变量?
  • 我不需要在浏览器中更改 URL,我只需要我解释的幕后发生的事情。

标签: php codeigniter url-routing


【解决方案1】:

正如Hashem Qolami 所说,使用sessioncookie 会更好。

CodeIgniter 中的路由不会改变 URL。它允许您更改 CI 对 URL 的操作。您可以使用服务器端功能来做您想做的事情(例如 apache 重写、nginx conf 等),但这超出了这里的范围。


编辑:

要在不更改 URL 的情况下做你想做的事,你只需将值传递给视图:

控制器:

$layout = $this->uri->segment(1);
$data["layout"] = $layout;
$this->load->view("cool_view", $data);

cool_view.php:

    <link rel="stylesheet" type="text/css" href="<?php echo $layout; ?>.css">

【讨论】:

  • 也许我的问题具有误导性,我不需要更改用户在浏览器中看到的内容,我只需要我解释的内容会在 CI 中发生。
  • 更新了答案。小心将用户输入传递给视图(即使 CI 对它在 URI 中允许的内容很吝啬)。 Session 或 cookie 仍然是更好的处理方式。
  • 是的。每个控制器都扩展了主控制器,所以我想我可以在那里添加代码并使用会话而不是视图变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多