Определить глобальную переменную для моделей и контроллеров в CakePHP 2.2

В настоящее время я использую что-то вроде этого:

//at bootstrap.php file
Configure::write('from', '[email protected]')

//at controllers or models files
$var = Configure::read('from')

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

Я думал сделать это с AppModel, но тогда это было бы доступно только для моделей, а не для контроллеров.

Что мне делать в этом случае?

Спасибо.


person Alvaro    schedule 30.10.2012    source источник
comment
CakeDC также предлагает механизм хранения ключей/значений в своем плагине Utils, поэтому вы можете просто использовать его: github.com/CakeDC. /utils Если вам нужно определить только одну переменную, и она является КОНСТАНТНОЙ, для приложения гораздо быстрее поместить ее в Config/bootstrap.php: define('VAR_NAME', value);   -  person Borislav Sabev    schedule 31.10.2012


Ответы (2)


Вы можете создать отдельную модель/плагин, который будет сопоставлен с таблицей конфигурации в вашей базе данных. Затем загрузите его через оператор $uses для контроллеров и App::import() для моделей.

class SystemSetting extends AppModel {

/**
 * Return a list of all settings
 *
 * @access public
 * @return array
 */
    public function getSettings() {        
        return $this->find('all');
    }
}

Затем в вашем контроллере:

class SomeController extends AppController {

    var $uses = array('SystemSetting');

    public function displaySettings() {
        $settings = $this->SystemSetting->getSettings();
        // .. your code
    }
}

В модели:

App::import('Model', 'SystemSettings.SystemSetting');
$settings = new SystemSetting();
$mySettings = $settings->getSettings();

Это прекрасно работает. Конечно, вы также можете загрузить настройки как в AppController, так и в AppModel, чтобы следовать правилу DRY.

person bbb    schedule 30.10.2012
comment
Не странно ли вызывать модель из другой модели? - person Alvaro; 30.10.2012
comment
Как насчет модельных отношений? - person bbb; 30.10.2012
comment
Там не совсем отношения. С каким id вы их связываете? - person Alvaro; 30.10.2012
comment
Вы спросили, не странно ли вызывать Модель из другой Модели. Это не так, если взять пример. Но в этом случае вы также можете сохранить настройки с помощью Configure::write в AppController и получить к ним доступ с помощью Configure::read в моделях. - person bbb; 30.10.2012
comment
Кстати, вам придется повторить $settings = new SystemSetting(); $mySettings = $settings->getSettings(); в каждом методе модели вы хотите его использовать? Есть ли другой способ? - person Alvaro; 30.10.2012

  1. создайте getSettings в вашей AppModel
  2. в AppController вы можете написать этот метод:

    public function getSettings() {
        return $this->{$this->modelClass}->getSettings();
    }
    

таким образом, метод getSettings() доступен в любой модели и любом контроллере.

любой вызов модели:

$mysettings = $this->getSettings();

любой вызов контроллера:

$mysettings = $this->MODELNAME->getSettings();
person thanat    schedule 30.10.2012