1

我这是我的第一个 CI 项目,我正在尝试构建一个登录系统(3 个用户组 = 管理员、成员、公共)。我正在使用离子身份验证。

如果你想跳过细节..

..我的问题是我在我的家庭控制器中没有正确地执行我的“require_once”,或者我不了解关于扩展类的一些东西。或者我没有我妈妈告诉我的那么聪明。我收到此错误:

Fatal error: require_once() [function.require]: Failed opening required 'application/Application/Core/public_controller.php' (include_path='.:/Applications/MAMP/bin/php/php5.3.6/lib/php') in /Applications/MAMP/htdocs/NOIR_FINAL/application/controllers/public/home.php on line 4

我参考了这篇文章,因为它看起来是一个很好的做法。具体来说,我使用 MY_Controller 扩展了 CI_Controller(包含所有扩展 CI_Controller 的 Admin、Member 和 Public 控制器)。

http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth

然后我看到一些批评将所有这 3 个管理员、成员和公共控制器“打包”到一个“MY_Controller”中......所以根据 Phil Sturgeon,我试图将它们分成单独的类并使用 __autoload() 将它们拉入。

http://philsturgeon.co.uk/blog/2010/02/CodeIgniter-Base-Classes-Keeping-it-DRY

但不知何故,我觉得我现在只是让事情变得不必要地复杂化。

我想通过登录,然后根据用户组将它们发送到专用文件夹中的 3 个“家庭”控制器之一。这些家庭控制器扩展了Admin_controller、Member_controller 或Public_controller ...并且其中的每一个都扩展了MY_Controller,而MY_Controller 又扩展了CI_Controller。所以我会在他们各自的控制器中使用特定的方法,并在 MY_Controller 中使用一些通用的东西(检查站点是否处于活动状态/“打开”..检查用户代理..等)。对我来说,这似乎是一种很好的分离用户角色的方法。

根据 Sturgeon 的文章,我的配置中也有这个。

function __autoload($class)
{
    if(strpos($class, 'CI_') !== 0)
    {
        @include_once( APPPATH . 'core/'. $class . EXT );
    }
}

那么我是否会以正确的方式进行?自从我第一次尝试这个,我开始认为这变得有点太“弗兰肯斯坦”了。这是“身份验证/登录”...

function login() {

    if($_POST) {   //clean public facing app input
        $this->form_validation->set_rules('email', 'Email', 'required|valid_email');
        $this->form_validation->set_rules('password', 'Password', 'required');

        if ($this->form_validation->run() == true)
        {
            $identity = $this->input->post('email', true);
            $password = $this->input->post('password', true);
            $remember = $this->input->post('remember');
            if($this->ion_auth->login($identity,$password, $remember)) 
            {
                if($this->ion_auth->in_group('1'))
                {
                    $this->session->set_flashdata('message','Welcome');
                    redirect('admin/home','refresh'); // this might have to change @todo
                }
                elseif($this->ion_auth->in_group('2'))
                {
                    $this->session->set_flashdata('message','Welcome');
                    redirect('member/home','refresh');
                }
                else
                {
                    redirect('public/home','refresh');
                }   
            }
        }
        else 
        {
            // set error flashdata
            $this->session->set_flashdata('message','Your login attempt failed.');
            redirect('/');
        }
    }

    redirect('/');
}

..这里是“controllers/member/”中的 home.php .. 基本上只是设置视图并将 flashdata 消息(如果有)转换为 $data{'message']

class Home extends Member_Controller{
    require_once(APPPATH.'Application/Core/member_controller.php');
    public function __construct()
    {
        parent::__construct;
    }
    public function index()
    {
        // remember that $this->the_user is available in this controller
        // as is $the_user available in any view I load
        $this->load->model('Member_model');
        $this->data['message'] = $this->session->flashdata('message');
        $this->data['query'] = $this->Member_model->get_members();
        $this->data['title'] = 'Home';
        $this->load->view('member_view', $this->data);
    }
}

这是我的成员控制器和一些成员方法

class Member_Controller extends MY_Controller{
    public function __construct()
    {
        parent::__construct();
    }
    public function index()
    {
        $this->load->view('member_view');
    }
    public function edit_profile(){}
    public function delete_profile(){}

}

.. 和 MY_Controller 有一些常用的方法

class MY_Controller extends CI_Controller {
    protected $the_user;
    public function __construct()
    {
        parent::__construct();
        if( $this->config->item('site_open' ) === FALSE)
        {
            show_error("Sorry the site is shut right now.");
        }

        if( $this->ion_auth->logged_in() )
        {
            $this->the_user = $this->ion_auth->user()->row();
            $data->the_user = $this->the_user;
            $this->load->vars($data);
        }
        else
        {
            redirect('/','refresh');
        }

        //if the user is using a mobile, use a mobile theme
        $this->load->library('user_agent');
        if( $this->agent->is_mobile() )
        {
            $this->template->set_theme('mobile'); // what about admin @todo
        }
    }

    public function index()
    {
        redirect('/','refresh');
    }
} 

那么我正确地接近这个了吗?作为一个额外的问题,将索引方法放在只会被扩展的类上是否正确?例如,没有人会在 MY_Controller 上“登陆”。它总是会被延长。那么我需要放一个索引方法吗?它只是好的形式吗?我应该把它变成一个抽象类吗?

4

2 回答 2

1

在使用 require/include 时,您需要指定它,PATH并且它必须是绝对的或相对的。

绝对:

/my/cool/folder/file.php //which means from the root ("/") of the server

相对的:

./file.php //which means look in the current directory for file.php

或者

../file.php //which means go up one directory and look for file.php

如果 aPATH没有在requireor中定义include,系统将使用定义php.ini

您设置的内容:require_once('application/Application/Core/public_controller.php')将不起作用,因为您没有设置相对值或绝对值,因此系统正在PATH寻找public_controller.php.include_pathphp.ini

所有这一切,我们甚至还没有开始解释为什么你首先要包括你的公共控制器。

当你扩展一个类时,你就是让它作为现有类的附属物。因此,当您扩展时CI_Controller,由于CI_Controller在应用程序中已经可用,扩展功能也将可用,而无需包含文件。

不,您不需要indexMY_Controller.

最后,我不知道你需要做这一切......扩展核心类通常是为了添加一些你可能需要或缺少的功能到核心或覆盖现有功能。您正在做的是将在控制器中可以正常运行的代码移动到核心应用程序中。我认为它会起作用,但我认为这不是最佳实践,也不是很实用。

于 2012-11-19T18:37:24.863 回答
1

由于您提供的路径,您的包含失败,请查看错误消息。应用程序是不必要的,因为这是 CI 认为的应用程序路径。

require_once(APPPATH.'core/member_controller.php');

那应该可以解决它,但是在重读该代码后,我意识到……您甚至不需要它。无论如何扩展它应该包括它?我知道我没有在我的扩展控制器中做任何类似的包含

至于过于复杂的事情。我个人不觉得你过于复杂,除非在一个方面。我们的应用程序有 Admin_Controller、User_Controller 和 MY_Controller。您可能只是过于复杂的地方是拥有 Public_Controller。正如我所看到的,管理员和用户将拥有 MY 的所有功能,这是应用程序本身的基本功能。所以这本质上是我的公共控制器。

能够在一个地方限制对站点某些部分的访问非常有意义,并且它确实使应用程序的整体流程也更有意义。在我看来,这也意味着更少的开销,因为您没有在每次加载页面时加载具有所有不同场景所需的所有功能的控制器。

于 2012-11-19T19:14:06.680 回答