【问题标题】:parse url to get controller and action in Kohana 3解析 url 以获取 Kohana 3 中的控制器和操作
【发布时间】:2011-01-19 05:02:29
【问题描述】:

我在检测 Kohana 3 中引用页面的控制器/操作名称时遇到问题。

我要做的是检测referrer页面是来自内部还是外部。如果是外部的(例如来自google),我会做一些默认设置。如果是内部引用者(即来自同一个域),我需要根据该引用者页面的控制器和操作信息做一些不同的事情。

我从检查 $_SERVER["HTTP_REFERRER"] 开始,但我坚持从该变量中获取控制器和操作名称。由于我在引导程序中自定义了路线,因此我想获得相同的路线

我知道 Kohana 提供了获取当前请求的控制器和操作的方法。

$this->request->controller
$this->request->action
$this->request->param('paramname')

虽然我们想知道是否有方法可以解析给定的 URL 字符串并返回控制器/操作/参数信息。

有什么想法吗??

更新:

在对 Kohana 源代码进行了数小时的研究后,我找到了一个分两步的解决方案:

步骤 1. 将 URL 转换为 URI。如果来自外部引用,则 URI 应为 NULL。

function URL2URI($URL)
{
    if (empty($URL)) return NULL;
    $url_info = parse_url($URL);
    if (!isset($url_info['host']) || !isset($url_info['path'])) return NULL;
    return ($url_info['host'] === $_SERVER['HTTP_HOST']) ? ltrim($url_info['path'], '/') : NULL;
}

步骤 2. 使用所有路由测试 URI,并从匹配 URI 的路由中获取信息($match['controller'],$match['action'])。

function getInfoFromURI($URI)
{
     if (empty($URI)) return NULL;    
     $routes = Route::all();
     foreach ($routes as $oneRoute)
     if ($match = $oneRoute->matches($URI))
          return $match;    
     return NULL;
 }

【问题讨论】:

  • 为什么需要控制器和操作才能知道引荐来源是外部还是内部?
  • @sberry2A:因为页面必须针对不同的引荐来源做出不同的响应。例如如果访问者来自外部,则响应 A,如果来自内部页面 X,则响应 B,如果来自内部页面 Y,则响应 C,依此类推...
  • 终于找到了解决办法。请参阅上面的编辑版本。

标签: php url controller kohana action


【解决方案1】:

你不应该使用:

$controller = Request::factory($your_url_without_http)->controller;
$action = Request::factory($your_url_without_http)->action;

【讨论】:

  • 非常好的解决方案。它可以代替第2步。
  • 评论(来自提议的编辑 - 不是我):“保留返回的对象更有效,因为创建请求对象可能会进行大量的正则表达式匹配。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多