Конструкторы в PHP-Codeigniter - PullRequest
       2

Конструкторы в PHP-Codeigniter

0 голосов
/ 15 декабря 2011

Я использую Codeigniter для создания своего проекта.

Здесь у меня есть некоторые сомнения или мне нужны некоторые разъяснения.

Могу ли я использовать конструкторы, чтобы делать что-то, что влияет на все другие функции в codeigniter /php ??

Пожалуйста, посмотрите здесь:

<?php
class New extends CI_Controller
{
 function __construct()

{

//Constructor codes...

}
 function Create_page()  //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied. 
}
 function Edit_page()      //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied.
}
function Delete_page()  //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied.
}
function about_us()   //This is a public action no need to Log in 
{
   // this is a pulic action ,no need to check the login status
}
}
?> 

Как вы видите, мне нужно проверять статус входа в систему для каждой частной функции,

Есть лиЛюбой способ, которым я могу сделать это на конструкторе?так что конструктор проверит, вошли вы или нет .... но это должно повлиять только на некоторые функции ...

Ответы [ 5 ]

2 голосов
/ 15 декабря 2011

Я решил эту проблему следующим образом:

  1. Я создал новый базовый класс под названием «MY_Controller», который расширяет класс контроллера CI.
  2. Я написал doAuth()метод, который аутентифицирует пользователя или перенаправляет его на контроллер входа в систему.
  3. Теперь я вызываю этот метод из всех методов, которые должны быть безопасными

Кажется, он гораздо менее практичен, чем другие подходы, ноэто сэкономит вам определенную работу, если вы решите, что вам нужен другой контроллер для аутентификации.

2 голосов
/ 15 декабря 2011

Вызов функции в конструкторе, который проверяет следующие шаги:

  • определить, какие методы требуют входа в систему, а какие нет.
  • определить текущий вызов метода.
  • если требуется, то войдите, иначе нет.

<?php
class New extends CI_Controller
{

  var $publicMethods  = array("aboutUs"); 

 function __construct()

{

//Constructor codes...
  $this->_validateLogin();

}

 function _validateLogin()
 {
    $router = &load_class('Router');
    $currentMethod = $router->fetch_method();
    if(in_array($currentMethod,$this->publicMethods) == false){
       // call some login functionality
    }
  }

 function Create_page()  //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied. 
}
 function Edit_page()      //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied.
}
function Delete_page()  //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied.
}
function about_us()   //This is a public action no need to Log in 
{
   // this is a pulic action ,no need to check the login status
}
}
?> 
0 голосов
/ 15 декабря 2011

По сути, вы должны разделить те частные методы, которые вы хотите использовать вошедшему в систему пользователю, и публичные методы, к которым может получить доступ каждый. И если вы действительно хотите это сделать, вы можете сделать что-то вроде следующих методов. Более того, вы можете изменить auth_method (), чтобы удовлетворить ваши потребности с большим количеством аутентификаций.

class Page extends CI_Controller {

public function __construct()
{
    parent::__construct();
    $this->auth_method();
}

public function create_page()
{
    // ...
}

public function edit_page()
{
    // ...
}

public function delete_page()
{
    // ...
}

public function about_us()
{
    echo 'About Us Page';
}

private function auth_method()
{
    $protected_methods  = array('create_page', 'edit_page', 'delete_page');
    $segs   = $this->uri->segment_array();
    $method = isset($segs[1]) ? trim($segs[1]) : 'index';
    if(in_array($method, $protected_methods))
        exit("Access Denied.");
}

}
//END CLASS
0 голосов
/ 15 декабря 2011

Чтобы ответить на ваш вопрос в строке, да, вы можете сделать. Создайте библиотеку и добавьте функцию, как я сделал ниже, загрузите библиотеку в конструкторе и сделайте вызов этой функции. Я предполагаю, что вы устанавливаете сигнал, когда пользователь входит на ваш сайт, например, user_login в течение сеанса. Надеюсь, что это отвечает на ваш вопрос.

// Place this function in the user library
  check_user_login(){
  $obj = get_instance();
   if($obj->session->userdata('user_logged') != true):
  // redirect to login page
   endif;
 }    
<?php
class New extends CI_Controller
{
 function __construct()

{

//Constructor codes...
//load the library,
$this->load->library("library_name");
// call the function name
check_user_login();

}

 function Create_page()  //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied. 
}
 function Edit_page()      //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied.
}
function Delete_page()  //The user need to be Logged in to perform this
{
 //Checking whether the user logged in or not if yes allowed else denied.
}
function about_us()   //This is a public action no need to Log in 
{
   // this is a pulic action ,no need to check the login status
}
}
?> 
0 голосов
/ 15 декабря 2011

, если вы даете своему конструктору пароль и имя пользователя и затем проверяете, сохранен ли его лог-логин у вас в переменной (true / false)

class newclass{

 public function __construct($username,$password){

  $query = mysql_query("SELECT * FROM accounts WHERE user = '".$username."' AND pass = '".$password."'");
  if(mysql_num_rows($query) > 0){ // if username and password match in database your loggend in
   $this->loginCheck = true;
  }
  else{ // if not match not logged in
   $this->loginCheck = false;
  }
 }//end constructor

 public function another(){
  if($this->loginCheck){
   return "logged in";
  }
  else{
   return "nog logged in";
  }

 }// end another function

}//end class

$class = new newclass($user,$pass);
echo $class->another();
...