我正在关注the Nettuts tutorial以使用CodeIgniter实现Basecamp样式的子域。
基于调用子域,数据库中的子域表返回与该子域对应的扩展名。因此,对于stackoverflow.mywebsite.com
,它将返回扩展名sf
,并且在整个网站上使用的图像文件夹和CSS文件将根据此扩展名进行更改;例如,images_sf
,style_sf.css
等
现在,在M,V或C的任何地方获取此扩展的最佳方法是什么?
选项:
MY_Controller
中为此设置变量,并通过$this->
随处访问该变量。我是否错过了其他选择?另外,假设这将在整个代码中大量使用,哪一个最好?
由于
答案 0 :(得分:4)
就个人而言,我会为您扩展的每个站点创建一个基本控制器,只需使用$this->load->vars($data);
加载您需要全局设置的信息。
在特定基础控制器的构造函数中,只需将数据加载到全局视图中,就像这样。
$data->some_var = "some value";
$this->load->vars($data);
然后在此控制器(或基本控制器)加载的所有视图中,您可以直接在视图中使用变量$some_var
。
答案 1 :(得分:2)
你最好的选择可能是选项3,把它放在你的基础控制器的构造函数中,可能是MY_controller或你扩展的任何控制器(现在CI_Controller与CI2.0正式版)
但是,如果你所做的只是获得扩展,那么可能没有理由拥有数据库表,因为你可以将它保存在配置文件中
我会做这样的事情......在MY_Controller.php中(这是CI 2.0语法)
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Controller extends CI_Controller {
function __construct()
{
parent::__construct();
$subdomain_arr = explode('.', $_SERVER['HTTP_HOST'], 2);
$subdomain_name = $subdomain_arr[0];
$this->load->config('sub_prefix');
$pre_arr = $this->config->item('prefixes');
/* Check to make sure the subdomain name is in the config array */
$this->prefix = isset($pre_arr[$subdomain_name]) ? $pre_arr[$subdomain_name] : '';
}
然后在配置文件(sub_prefix.php)
中<?php if (! defined('BASEPATH')) exit('No direct script access');
$config['prefixes'] = array('subdomain1' => 'sub1',
'stackoverflow' => 'sf');
这样,每次页面加载时都不需要运行额外的查询以获得相对静态的内容...如果你到了需要除了前缀之外还需要更多信息的地方,那么用数据库
来做是有意义的您现在可以在您将使用的任何视图,控制器或模型中使用$ this-&gt;前缀...这是在您的应用程序中大量使用的最佳方式。