Настройка среды сценария оболочки CakePHP - PullRequest
1 голос
/ 02 ноября 2011

Я новичок в разработке оболочки в Cake. Проблема, с которой я сталкиваюсь, заключается в настройке источника данных в самом скрипте. Моя база данных.php есть;

function __construct() 
{ 
    if(getenv('ENVIRONMENT') == 'staging') {
        $this->default = $this->staging;
    } else {
        $this->default = $this->production;
    }
} 

Итак, я настраиваю базу данных на основе настроек среды веб-сервера. Естественно, php-cli не может получить доступ к этой переменной. В итоге я создаю задачу оболочки CakePHP.

class SelectEnvTask extends Shell {

    public function execute() 
    {
        App::Import('ConnectionManager', 'Model');
        $configs = ConnectionManager::enumConnectionObjects();

        if (!is_array($configs) || empty($configs)) {
            $this->out('Error! No database configuration has been found.');
        }

        $connections = array_keys($configs);

        if(!isset($this->args[0])) {
            $this->out('Error! Please enter one of the environment settings as an argument: ' . implode('/', $connections) . 
                "\n\n" . 'eg. ./Console/cake *script_name* *environment*', 2);
            exit(1);
        }

        if(!in_array($this->args[0], $connections)) {
            $this->out($this->args[0] . ' environment could not be found!', 2);
            exit(1);
        }

        //hacky solution until finding a better one
        $models = App::objects('Model');
        foreach($models as $model) {
            ClassRegistry::init($model)->setDataSource($this->args[0]);
        }
    }
}

Это работает правильно, однако, как вы видите в приведенной ниже задаче, я получаю все названия моделей и меняю их соединение с БД, что не является хорошей практикой. Я также не хочу устанавливать больше переменных в класс базы данных и хотел бы обрабатывать их в оболочках / задачах.

Есть ли более элегантный способ добиться этого?

Спасибо

1 Ответ

0 голосов
/ 30 июня 2012

Вот гораздо более элегантное решение. Добавьте следующий метод к вашей оболочке или задаче, а затем выполните его всякий раз, когда вам нужно, чтобы изменить свой профиль данных (указанный в app / Config / database.php) на лету:

function change_database_profile($database = 'default') {
    $connected = ConnectionManager::getDataSource($database);
    if($connected->isConnected()) { 
        return true; 
    }   
    return false;
}
...