将模型内的模型和调用函数自动加载到整个项目
Autoload model and call function inside this model to whole project
我需要整个项目中此模型的功能(字面上我需要 $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;
}
}
我不知道 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()
;
但是,我认为从容器中注入它没有任何问题,无论您需要什么。这样做会更容易构建测试。
顺便说一句,如果没有为扩展 class 设置自定义参数,则不需要覆盖 class 构造函数。您可以安全地删除:
public function __construct() {
parent::__construct();
}
将此辅助函数放入任何加载的辅助函数中:
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->] 所以直接使用全局变量在模型和视图传递中做同样的事情这个变量通过控制器
我需要整个项目中此模型的功能(字面上我需要 $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;
}
}
我不知道 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()
;
但是,我认为从容器中注入它没有任何问题,无论您需要什么。这样做会更容易构建测试。
顺便说一句,如果没有为扩展 class 设置自定义参数,则不需要覆盖 class 构造函数。您可以安全地删除:
public function __construct() {
parent::__construct();
}
将此辅助函数放入任何加载的辅助函数中:
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->] 所以直接使用全局变量在模型和视图传递中做同样的事情这个变量通过控制器