我需要在整个项目中使用此模型的函数(字面意思是我需要$data
)。当我打电话给一些控制器$data = $this->multi_language_model->multi_lang();
它工作正常。但是可以在一个地方打电话,所以我可以在每个控制器和视图中使用。
我自动加载模型$autoload['model'] = array('multi_language_model');
class Multi_language_model extends MY_Model
{
public function __construct() {
parent::__construct();
}
public function multi_lang() {
$data['menu_delivery'] = $this->lang->line('menu_delivery');
$data['menu_quotations'] = $this->lang->line('menu_quotations');
$data['menu_customer_service'] = $this->lang->line('menu_customer_service');
return $data;
}
}
将此帮助函数放在任何加载的帮助器中:
function get_multi_lang(){
$CI = & get_instance();
$data = array();
$CI->load->helper('language');
$CI->lang->load('menu','english');
$data['menu_delivery'] = $CI->lang->line('menu_delivery');
$data['menu_quotations'] = $CI->lang->line('menu_quotations');
$data['menu_customer_service'] = $CI->lang->line('menu_customer_service');
return $data;
}
控制器:
class Yourclassname extends CI_Controller {
var $menu_delivery = "";
var $menu_quotations = "";
var $menu_customer_service = "";
function __construct() {
parent::__construct();
$data = get_multi_lang();
$this->menu_delivery = $data['menu_delivery'];
$this->menu_quotations = $data['menu_quotations'];
$this->menu_customer_service = $data['menu_customer_service'];
}
public function index(){
echo $this->menu_delivery.'<pre>';
echo $this->menu_quotations.'<pre>';
echo $this->menu_customer_service.'<pre>';die;
}
}
如果你不想使用辅助函数,那么在控制器__construct()中复制辅助函数行[将$ data替换为$ this - >],这样直接使用全局变量在模型中做同样的操作,并且视图通过控制器传递这个变量
我不知道codeigniter是如何工作的,但也许你可以做这个方法静态并使用它像:
class Multi_language_model extends MY_Model
{
private static $data = [];
public function get_multi_lang()
{
return [
'menu_delivery' => $this->lang->line('menu_delivery'),
'menu_quotations' => $this->lang->line('menu_quotations'),
'menu_customer_service' => $this->lang->line('menu_customer_service'),
];
}
public static function multi_lang()
{
if (empty(self::$data)) {
self::$data = (new self)->get_multi_lang();
}
return self::$data;
}
}
然后,只要你需要它,你可以使用$data = Multi_language_model::multi_lang()
;
但是,我没有看到从容器中注入任何错误,无论你需要它。这样做会更容易构建测试。
顺便说一下,如果没有为扩展类设置自定义参数,则不需要覆盖类构造函数。您可以安全地删除:
public function __construct() {
parent::__construct();
}