创建合适的控制器

时间:2013-03-30 02:32:42

标签: php codeigniter

我有一个控制器,它有很多功能,我注意到当我加载欢迎视图时,我的get_participants函数没有运行,因为当我尝试使用<?php echo $product ?>时我获取未定义的变量异常。

我不希望在我的索引函数中加载欢迎视图的所有内容,但是许多函数会创建一个视图。调用这个控制器以便它运行类中的每个函数的正确方法是什么,还是有更好的方法我应该这样做?

class Welcome extends CI_Controller
{
    function __construct()
    {
        parent::__construct();

        $this->load->helper('url');
        $this->load->library('tank_auth_groups','','tank_auth');
        $this->load->model('Participant_model');
    }

    function index()
    {
        if (!$this->tank_auth->is_logged_in()) {
            redirect('/auth/login/');
        } else {
            $data['user_id']    = $this->tank_auth->get_user_id();
            $data['username']   = $this->tank_auth->get_username();
                $this->load->view('welcome', $data);
        }

    }


   public function get_participants()
    {

        $data['product'] = $this->Participant_model->get_all_records();

        $this->load->view('welcome', $data);
    }

}

视图

Hi, <strong>
<?php echo $username; ?></strong>! You are logged in now. 
<?php echo anchor('/auth/logout/', 'Logout'); ?>
<?php echo $product; ?>

1 个答案:

答案 0 :(得分:3)

为什么不直接在索引中调用产品模型?

function index()
{
    if (!$this->tank_auth->is_logged_in()) {
        redirect('/auth/login/');
    } else {
        $data['user_id']    = $this->tank_auth->get_user_id();
        $data['username']   = $this->tank_auth->get_username();
        $data['product'] = $this->Participant_model->get_all_records();

        $this->load->view('welcome', $data);
    }
}

没有明显的理由将其分成自己的方法。

您还可以设置类变量,并让方法相应地影响它们。这很大程度上取决于你的需求,所以一个恰当的例子可能并不完全适用。

class Welcome extends CI_Controller
{
    private $data = array(
        'user_id' => null,
        'username' => null,
        'product' => null
    );

    function __construct()
    {
    ...

然后让各个方法影响public $ data array中的某些元素

   public function get_participants()
    {
        $this->data['product'] = $this->Participant_model->get_all_records();
    }

并让你的索引方法加载类数组,而不是专门填充它...

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

    $this->load->helper('url');
    $this->load->library('tank_auth_groups','','tank_auth');

    if (!$this->tank_auth->is_logged_in()) {
        redirect('/auth/login/');
    } else {
        $this->data['user_id']    = $this->tank_auth->get_user_id();
        $this->data['username']   = $this->tank_auth->get_username();
    }

    $this->load->model('Participant_model');
}

function index()
{
    $this->get_participants();
    $this->load->view('welcome', $this->data);
}

请注意,这只是您如何安排课程以满足您需求的一个示例。不一定是良好习惯或任何事物的例子。最终,您应该以符​​合您需求的合理方式进行编程,并且任何普通人都可以合理地阅读。 只是我的意见。

我应该说我认为尝试建立一个强制运行其中的每个方法来创建一个视图的类是一个坏主意。线性执行与将所有内容堆积到索引方法中基本相同。也许我错过了你的陈述的重点。