我这是我的第一个 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 上“登陆”。它总是会被延长。那么我需要放一个索引方法吗?它只是好的形式吗?我应该把它变成一个抽象类吗?