将公共变量添加到所有CI_Controller以及扩展它们的任何内容?

时间:2013-03-26 13:23:17

标签: php codeigniter

您好我想向CI_Controllers的所有实例添加一个公共变量($ this-> data []),这样我就可以存储一些基本规则来输出页面(css / js等)然后有每个控制器附加到此数组以添加其自己的要求(更多css / js)。我有一个带有自定义视图函数的核心库,它接收这些数组并将它们注入页面模板的head标记。

我想到的选项;

  1. 编辑CI_Controller并将其添加到那里......猜测这是一个坏主意。

  2. 创建一个扩展CI_Controller的shell控制器,将var添加到该控制器,然后让其他所有控制器扩展shell控制器。

  3. 还有其他聪明的方法吗?

  4. 我只使用CI大约一个月了,我试过阅读文档,但我找不到任何内置的方法来做这样的事情?有没有人遇到过这个问题,如果有的话你是怎么解决的?

    谢谢!

    [edit]使用PHP 5.3.x [/ edit]

3 个答案:

答案 0 :(得分:2)

http://ellislab.com/codeigniter/user-guide/general/creating_libraries.html

您可以扩展CI_Controller以获得所需的功能。

应用/核心/ MY_Controller.php:

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

class MY_Controller extends CI_Controller {


    public function __construct()
    {
        parent::__construct();
    }

    public function my_function()
    {
        return "Cool return from my_function";

    }
}

控制器/的welcome.php

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

class Welcome extends MY_Controller {

    public function index()
    {
        echo $this->my_function();//echo's "Cool return from my_function"
    }
}

您只需在MY_Controller中定义所需的功能即可。然后在您的控制器中,使用extends MY_Controller而不是extends CI_Controller,您可以在这些控制器内的任何位置调用函数。

答案 1 :(得分:1)

我认为使用特征可以很容易地实现你想要的东西。点击此处:PHP: Traits

更具体地说 - &gt;示例#11定义属性。

唯一的限制是PHP 5.4 +

答案 2 :(得分:0)

您可以创建自己的基本控制器文件,以继承\ application \ core \ MY_Controller.php中的基本页面加载方法:

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

class MY_Controller extends CI_Controller {

    public function __construct()
    {
        parent::__construct();
    }

    protected function loadPage($path, $data = array())
    {
        $this->load->view('common/head'); // Assuming you will use a folder for page parts
        $this->load->view($path, $data);
        $this->load->view('common/foot');
    }
}

然后在您的页面控制器中,您可以更轻松地调用相同的方法:

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

class User extends MY_Controller {

    public function index()
    {
        $data = array(); // get data from model

        $this->loadPage('user/view', $data); // Assuming you will use folders for sets of views
    }

    public function edit()
    {
        $data = array(); // get data from model

        $this->loadPage('user/edit', $data);
    }
}