在此模型中自动加载模型和调用函数到整个项目

问题描述 投票:1回答:2

我需要在整个项目中使用此模型的函数(字面意思是我需要$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;

   }
}
php codeigniter model autoload
2个回答
1
投票

将此帮助函数放在任何加载的帮助器中:

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 - >],这样直接使用全局变量在模型中做同样的操作,并且视图通过控制器传递这个变量


0
投票

我不知道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();
}
© www.soinside.com 2019 - 2024. All rights reserved.