Я перерабатываю свою систему, используя CodeIgniter, который я новичок, и я пытаюсь загрузить функцию из моего контроллера, которая будет проверять, есть ли у пользователя разрешение на просмотр / доступ к этой функции.
Я использую TEXT
в моей БД со всеми разрешениями, которые есть у каждого уровня пользователя, а затем сохранить разрешения в сеансе var, с которым работает в моем контроллере.
В моем контроллере Users.php
:
public function UserHasPermissions($permission){
checkSession($this);
$arrayPermissions = explode($this->sessions->userdata('session_permissions'));
if(in_array($permission, $arrayPermissions)){
return true;
} else {
return false;
}
}
По-моему home.php
я делаю следующую попытку:
$this->load->view('commons/header');
if($this->Users->UserHasPermissions('ADD_MEETING')){
echo 'content';
}
$this->load->view('commons/footer');
И это возвращает эту ошибку:
An uncaught Exception was encountered
Type: Error
Message: Call to a member function UserHasPermissions() on null
Filename: /var/www/html/DF_CHECKER_CI/application/views/home.php
Line Number: 4
Я взглянул на эти документы, но ничто не сильно помогло мне.
https://www.codeigniter.com/user_guide/general/views.html#adding-dynamic-data-to-the-view
Вы нарушаете MVC, пытаясь вызвать контроллер из своего представления, вместо этого вы должны определить, какие разрешения имеет пользователь в контроллере, прежде чем отображать ваше представление, либо в методе, который отображает представление, либо в конструкторе вашего класса. С учетом вышесказанного вы не можете вызвать контроллер из представления в CI, если не ссылаетесь на экземпляр singleton CI:
$ci = &get_instance();
$this->load->view('commons/header');
if($ci->UserHasPermissions('ADD_MEETING')){
echo 'content';
}
$this->load->view('commons/footer')
Это приведет к ошибке, однако:
объект класса Users не может быть преобразован в строку
Вот один из способов:
class Users extends CI_Controller{ //or whatever you're doing here
public function __construct()
{
// you can check all permissions here if you'd like
}
/**or**/
/**whatever is responsible for calling your view**/
public function index()
{
$data['has_permission'] = $this->userHasPermissions('ADD_MEETING');
$this->load->view('home',$data);
}
private function userHasPermissions($permission)
{
return in_array($permission, $this->sessions>userdata('session_permissions'));
}
}
И по вашему мнению:
<?if($has_permission):?>
<--show content-->
<?endif;?>
Вы можете сделать модель, или помощника, или библиотеку. Хотя модель / помощник подойдет лучше. Это относительно просто, особенно если вы использовали КИ в любом качестве до того, как вы это сделали.
Единственное, на что следует обратить внимание, это то, что если вы используете помощника, вы должны обращаться к экземпляру CI, как это делается в функции: $CI = &get_instance();
и тогда вы можете использовать его как $CI->load->database(); $CI->db->get('users')->result();
или что угодно.