首页 > 解决方案 > 我如何分离一个功能,并将其调用给我的所有控制器

问题描述

我有一个函数,它是一个很长的函数,这个函数需要在我所有的控制器中运行,特别是在索引函数中,以便在我的控制器的每个负载中运行这个函数。我尝试使用include但没有用。我使用 HMVC 作为我的模式。

我知道这不是一个好主意,但是,这是我的功能的外观。

public function sample(){
            foreach($this->First_model->getID() as $data)
            {
                if($this->First_model->getNewData($data["id"]) == 0)
                {
                    if((date('d')) == $data["month"])
                   {
                        $in = date_create($data["date_of_activation"]);
                        $end_date = date_modify(date_create($in->format('Y-m-' . $data["month"])),"+1 month")->format('Y-m-d');

                        if($this->First_model->check_history($data["id"]) >=1)
                        {
                            $price = $this->First_model->getElectricity_with_history($data["id"],$data["date_of_activation"],$end_date);

                        }
                        else
                        {
                                $price = $this->First_model->getElectricity_no_history($data["id"],$data["date_of_activation"],$end_date);

                        }

                        if($this->First_model->check_data($data["id"])== 0)
                         {
                            $data = array(
                                "id" => $data["id"],
                                "is_updated" => "0",
                                "total" => $price->price
                            );

                            $this->First_model->insert_data($data);
                         }
                   }
                }
                else
                {

                   if((date('d')) == $data["month"])
                   {
                        $start = date("Y-m-d", strtotime("+ 1 day - 1 month"));
                        $end = date("Y-m-d", strtotime("+ 1 day"));

                        $price = 0;
                        if($this->First_model->check_history($data["id"]) >=1)
                        {
                            $price = $this->First_model->getValue_history($data["id"],$start,$end);

                        }
                        else
                        {
                             $price = $this->First_model->getElectricity_no_history($data["id"],$start,$end);

                        }

                        if($this->First_model->check_if_has($data["id"])== 0)
                         {
                            $data = array(
                                "id" => $data["id"],
                                "is_updated" => "0",
                                "total" => $price->price
                            );


                            $this->First_model->insert_data($data);
                         }
                   }
                }
            }
}

有没有办法可以为我的所有控制器调用它?所以不要把这个很长的函数放在我的每个控制器中。

标签: phpcodeigniter

解决方案


如果您有一个所有其他控制器都扩展的基本控制器类,则可以在那里定义 index 方法。

class BaseController
{
    public function index() {
        // code that you want to run in every controller
    }    
}

如果子类需要提供额外的功能,您可以重写 index 方法,在那里调用父 index 方法来调用基本功能,然后编写更多代码来定义除此之外它需要做的任何其他事情。

class SomeController extends BaseController
{
    public function index() {
        parent::index();
        // code specific to the child controller
    }
}

老实说,我并没有真正过多地研究您的特定功能的作用,但是这种模式可以很好地解决您描述的一般问题。


推荐阅读