根据 url 更改 CodeIgniter 控制器目录

Posted

技术标签:

【中文标题】根据 url 更改 CodeIgniter 控制器目录【英文标题】:Change CodeIgniter controllers directory depending on url 【发布时间】:2012-08-03 19:50:54 【问题描述】:

我是 CodeIgniter 的新手,我必须制作一个位于子域上的移动网站。取决于您是否是移动设备,唯一不同的是要加载的内容是controllers 目录,应用程序文件夹的所有其余部分都适用于两个版本。如何告诉 CodeIgniter 根据某些参数对特定的controllers 目录收费?

或者这不是使用 CodeIgniter 基于子域管理移动网站的最佳方式吗?我想访问相同的自定义库和模型。

谢谢你的指导,我迷路了! :)

【问题讨论】:

我不完全了解 CI,但是如果您在检查主机名的类的构造上添加一些内容并包含位于不同文件夹中的扩展类,然后调用此类呢?您将不得不进行一些黑客攻击,但这似乎是可能的。或者你可以随时使用钩子 看起来很有趣,我会研究一下,谢谢! 【参考方案1】:

我建议不要创建多个控制器目录。对于您网站的大部分内容,控制器逻辑很可能是相同的。您可以在控制器中创建单独的函数,以应对移动版本和桌面版本不同的情况。

首先,我建议让所有控制器都继承自自定义控制器。请参阅 Phil Sturgeon 在Keeping It Dry 上的帖子。实现此功能后,您可以在此自定义“母”控制器中检查请求是来自移动设备还是桌面设备,并且所有后代控制器都会知道它。使用CodeIgniter's native$this->agent->is_mobile()

class MY_Controller extends CI_Controller
    function __construct()
        parent::__construct();
        $this->data['agent'] = ($this->agent->is_mobile())? 'mobile' : 'desktop';
        $this->load->vars($this->data);
    

会改变的是您的演示文稿,而不是您的控制器。现在您知道了请求的来源(代理),您可以渲染相应的内容:

在您的views 目录中创建两个目录。

views
    desktop
    mobile

当调用你的观点时:

$this->load->view($this->data['agent'] . "/theview");

关于您在评论中提到的 ajax 请求——您可以检查那些使用 CodeIgniter's native $this->input->is_ajax_request() 函数的请求。当用户单击您网站上的链接或按钮并触发控制器时,无论是在移动设备还是桌面设备上,他们通常会共享类似的功能(例如数据库写入)......但您可以使用 is_ajax_request() 函数来区分并提供适合平台的响应。

建议查看my answer 以了解有关视图结构的另一个 *** 问题以获取更多信息。

希望这会有所帮助。

【讨论】:

你的回答太棒了乔丹,非常感谢!我当然会接受!如果你能帮助我,我有两个问题:在移动网站上,如果我想放置一个链接来显示桌面版本,最好的做法是在那个自定义控制器中进行会话,对吗?此外,为了管理图像和 CSS,是否有关于这种情况的最佳实践?非常感谢您的帮助和有益的回应,再次感谢您!【参考方案2】:

您需要查看routing 来做您想做的事情。我不确定您为什么需要不同的控制器,因为我假设您显示的数据对于每个页面(移动设备与非移动设备)都是相同的 - 只是布局会更改以更好地适应移动平台。如果是这种情况,您需要做的就是在根据用户代理收集/处理控制器中的所有数据之后加载不同的视图(分别为移动/桌面视图) - 您甚至不需要不同的视图子域更不用说另一组控制器了。 就是MVC的力量。

【讨论】:

移动版实际上会包含不同的功能,有些请求不会以完全相同的方式完成(移动端的ajax,而不是桌面端的例子)。

以上是关于根据 url 更改 CodeIgniter 控制器目录的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter 3分页不起作用

CodeIgniter 控制器方法参数问题

代码点火器 URL 更改

在Codeigniter中搜索的分页不起作用

如何从 codeigniter 控制器访问站点 url 或基本 url?

由于 URL 中的参数编码,Codeigniter 控制器失败