2016-08-18 13 views
0

У меня есть система управления контентом, где константы на основе slug для каждого подходящего каталога пользователя в журнале определены для одного или всех контроллеров внутри модели. Я случайно наткнулся на эту находку, экспериментируя с переопределением констант для каждого зарегистрированного пользователя.Переопределение констант на основе кодовых слов Codeigniter в модели на пользователя

Я не думал, что переопределяющие константы были возможны, но я думаю, что не понимаю, как Codeigniter или PHP могут переопределять константы таким образом. Я не получаю никаких ошибок PHP, заявляя, что он не смог переопределить константы, и мне кажется, что экземпляр модели или контроллера не настроен для каждого контроллера?

Контроллер:

class Content extends CI_Controller { 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('main_model'); 

     ... 
      get slug from logged_in user 
     ... 

     $this->main->set_slug_based_constants($slug) 
    } 
} 

Один основной моделью (я знаю, что это плохо, чтобы сделать это):

class Main_model extends CI_Model{ 

    public function set_slug_based_constants($slug) 
    { 
     define('CLOUDFRONT_DIRECTORY', $slug.'_cloudfront_directory'); 
    } 
} 

From Codeigniter Docs: Dynamic Инстанцирование. В CodeIgniter компоненты загружаются, а процедуры выполняются только по запросу, а не по всему миру.

Поэтому я хотел бы поверить, что мое предположение верно в этом случае на основе документов Codeigniter.

ответ

1

Это не так много «неустановленных», как «еще не определено». Каждый запрос браузера на URL (контроллер) является уникальным процессом на сервере. Таким образом, константа не переопределяется, а вновь создается для каждого запроса URL.

Если вы попытаетесь запустить $this->main_model->set_slug_based_constants($slug); второй раз, когда вы будет получить сообщение об ошибке PHP о том, что постоянная CLOUDFRONT_DIRECTORY уже определена.

Попробуйте эту версию контроллера, чтобы увидеть сообщение об ошибке.

class Content extends CI_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     $this->load->model('main_model'); 
     $this->main_model->set_slug_based_constants("Dave"); 
    } 

    function index() 
    { 
     echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>"; 
     $this->main_model->set_slug_based_constants("jruser"); 
     echo "The constant's value is <strong>".CLOUDFRONT_DIRECTORY."</strong><br>";; 
    } 

} 

Он будет выдавать результат примерно так.

значение константе является Dave_cloudfront_directory

PHP-ошибка была обнаружена

Серьезность: Обратите внимание

сообщение: Constant CLOUDFRONT_DIRECTORY уже определен

Имя файла: модели/Main_model.php

Количество

Линии: 13

значение константы является Dave_cloudfront_directory

 Смежные вопросы

  • Нет связанных вопросов^_^