【问题标题】:codeigniter seems not reusing model objectcodeigniter 似乎没有重用模型对象
【发布时间】:2015-04-26 09:01:32
【问题描述】:

通常,codeigniter 使用以下结构。

class AController extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->model('ModelA');
        $this->load->model('ModelB');
        $this->load->model('ModelC');
        ...
    }
}

而且我是 codeigniter 的新手,我只是想知道我是否可以让它更快。每次发出请求时我都应该加载这些模型吗?这会导致响应缓慢。

在python龙卷风的情况下,它们可以存储数据库模型对象,以便所有请求共享一个模型对象。 codeigniter中有这样的方法吗?

【问题讨论】:

  • 您需要确保模型在使用前已加载一次。
  • @ShaifulIslam thx,您能告诉我在使用前如何检查吗?

标签: codeigniter


【解决方案1】:

您需要确保您的模型在使用前已加载。

1.您可以在Controllers构造函数中编写它,这样您就不需要在其他方法中加载模型。例如

class AController extends CI_Controller
{
   public function __construct()
    {
        parent::__construct();
        $this->load->model('ModelA');
        $this->load->model('ModelB');
        $this->load->model('ModelC');
    }
    public function index()
    {
        $this->ModelA->model_funtion();//now you can call model function for m any function of controller.
    }
}

2.你可以在使用前调用它。

class AController extends CI_Controller
{
   public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        $this->load->model('ModelA');
        $this->ModelA->model_funtion();
    }
}

3.您可以在 autoload.php 中加载。因此该模型可以在任何地方(在任何控制器内)使用。

【讨论】:

  • 是的,每次请求都会调用构造函数,因此如果您需要该控制器中的模型,您可以在构造函数中加载模型。但请记住按照我编写的方式编写代码。您的示例代码是错误的方式。跨度>
【解决方案2】:

如果您希望它在大多数地方,但不是在所有地方,那么作为替代方案,你可以创建一个自定义控制器然后使用它。

1. /application/core/Custom_Controller.php 的代码:

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Custom_Controller extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->load->model('ModelA');
        $this->load->model('ModelB');
        $this->load->model('ModelC');
    }
}

2。然后将控制器扩展为:

include_once(APPPATH.'core/Custom_Controller.php');
class AController extends Custom_Controller
{
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        // Do something
    }
}

【讨论】:

    【解决方案3】:

    请试一试..

    class AController extends CI_Controller
    {
        function __construct(){
            parent::__construct();
            $this->load->model('ModelA');
            $this->load->model('ModelB');
            $this->load->model('ModelC');
        }
        public functionname()
        {
            $this->ModelA->modelfunctionname();
        }
    }
    

    【讨论】:

    • 请在您的回答中添加一些详细信息。仅代码回答对其他人没有太大帮助。
    • Codeigniter 控制器写入:AController 类扩展 CI_Controller { function __construct(){ parent::__construct(); $this->load->model('ModelA'); $this->load->model('ModelB'); $this->load->model('ModelC'); } public functionname() { //加载任何模型名 $this->ModelA->modelfunctionname(); //加载任何视图页面可能是你得到它 $this->load->view('viewpage'); } }
    【解决方案4】:

    我意识到重复使用是不可能的,但我找到了更好的方法。 像这样的。

    class AController extends CI_Controller
    {
        public function __construct()
        {
            parent::__construct();
            $method = $this->router->fetch_method();
            switch($method) {
                case "method1":
                    $this->load->model('ModelA');
                case "method2":
                    $this->load->model('ModelB');
                    break;
                default:
                    $this->load->model('ModelA');
                    $this->load->model('ModelC');
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2019-10-16
      • 2014-03-05
      • 1970-01-01
      相关资源
      最近更新 更多