#php #cakephp
#php #cakephp
Вопрос:
У меня есть консольная оболочка CakePHP, которая работает нормально, пока Model->afterFind()
не попытается добавить некоторые данные к результатам, которые включают добавление ссылок, которые, похоже, не работают при вызове из консоли.
Есть ли способ проверить в Model->afterFind()
функции обратного вызова, вызывается ли она из консольной оболочки, чтобы я мог пропустить проблемный раздел, который мне все равно не нужен?
Спасибо, Ян
Ответ №1:
Я не слишком уверен, есть ли для этого Cake-способ, но вы можете сделать это с помощью обычного PHP
if(php_sapi_name() == 'cli' amp;amp; empty(getClientIP())) {
//running via CLI
} else {
//running normally
}
Комментарии:
1. Использование
php_sapi_name()
для проверки того, выполняемся ли мы через cli, сработало бы, особенно если бы оно было обернуто в функцию AppModel для повторного использования и оптимизации. Однако, в конце концов, я обнаружил, что могу предотвратить возникновение ошибки, ужесточив поиск, который вызвал проблему (удалив определенное поле из запроса), так что раздел, вызывающий проблему, никогда не вводился из-за других уже выполненных тестов.2. всегда более одного способа освежевать кота 🙂
Ответ №2:
Мне кажется, что вы нарушаете рекомендации MVC, если ваш бизнес-уровень (модель) оказывает неблагоприятное воздействие при запуске в разных контекстах. Что бы вы ни вводили в Model-> afterFind(), должно быть полностью независимым от того, как выполняется приложение.
С учетом этого, уровень модели CakePHP вообще не осведомлен о контексте выполнения. Одним из решений было бы справиться с этим, передав флаг уровню модели из оболочки. ie:
В верхней части app_model.php:
var $isShellContext = false;
Затем в вашей оболочке:
$this->Model->isShellContext = true;
А затем в Model-> afterFind():
if(!$this->isShellContext) {
// add links, etc
}