在不同应用程序之间共享CI模型

时间:2011-05-12 13:02:00

标签: php model-view-controller codeigniter mobile codeigniter-2

我仍在努力寻找一种让移动网站运行的方法。我在CodeIgniter中有一个Web应用程序,我想创建它的移动版本。但是,我不想重写太多的代码,特别是我的模型。(因为它们会返回我可以在任何地方使用的原始数据。)

我想在子域(m.mydomain.tld)上运行我的移动网站。桌面版本在www.mydomain.tld运行。我尝试将子域指向我的CI应用程序文件夹;当移动浏览器到达www.mydomain.tld时,我会将其重定向到m.mydomain.tld。正如我所说,这个子域指向我的CI应用程序文件夹;然后,我为移动优化的控制器和视图提供服务。

然而!正如app/config/config.php中所指定的,我的应用程序的base_url是:

$config['base_url'] = 'http://www.mydomain.tld/';

所以重定向到m.mydomain.tld并没有真正起作用,因为我仍然被重定向到www并且我不希望这样,即使它然后做了我想要它做的事情。

我试图解决这个问题的方法是制作两个具有不同控制器/视图的应用程序文件夹,但共享模型等等。所以,我正在试图找到一种方法来重构我的CodeIgniter应用程序,以便我可以共享我的模型和'自定义控制器'(MY_Controller),以及不同应用程序之间的一些自定义库/助手。

我希望这很清楚,如果不是,我会很乐意解释更多我正在寻找的东西。非常感谢!

3 个答案:

答案 0 :(得分:3)

也许你应该看看codeIgniter的2.0新功能:package。

包允许您与:

共享图书馆,模型等
$this->load->add_package_path('/usr/local/codeigniter/shared');

阅读本文: http://philsturgeon.co.uk/blog/2010/04/codeigniter-packages-modules

希望它有所帮助。

答案 1 :(得分:2)

我认为解决此问题的正确方法是在现有的网络应用中创建一组新的控制器和视图(针对移动设备)。然后只需为新的“移动”控制器定义路由(也许你还应该为每条路由添加“m /”或“mobile /”前缀),这就是全部。

<强>更新

好的,我明白了。我建议你这样做:

  1. 首先在config.php中创建此记录:

    $config["mobile_base_url"] = "http://m.yoursite.tld/";
    
  2. 然后创建你的url_helper,添加一个mobile_site_url()函数,该函数类似于CI site_url()函数(对于视图和控制器中的链接,你需要这个函数)。

  3. 创建移动视图和控制器,使用“m /”前缀为它们定义路由。

  4. 在此论坛页面http://www.webmasterworld.com/apache/3509887.htm中描述一下.htaccess hack for url rewriting,这样所有对m.yoursite.tld / ...的请求都会转到yoursite.tld / m /。 ..

  5. 我想你会遇到一些与这种方法有关的问题,但你绝对不应该为你的问题创建单独的CI应用程序。

    希望这有帮助。

答案 2 :(得分:2)

在config.php中将$config['base_url'] = 'http://www.mydomain.tld/';替换为:

if(isset($_SERVER['HTTPS']) and 'on' === $_SERVER['HTTPS']) {
    $config['base_url'] = 'https://';
} else {
    $config['base_url'] = 'http://';
}
$config['base_url'] .= $_SERVER['SERVER_NAME'] . '/';

这将从Apache /服务器环境变量获取URL,因此如果您通过子域访问该站点,那么它将使用子域URL,或者如果您通过根域访问它,它将使用根域。

我不是CI专家,所以可能有其他方法,但这是我所知道的最简单的解决方案。