Я пытаюсь создать cronjob, который вызывает определенное действие в контроллере. Сценарий оболочки, который я пишу, похоже, не может обойти контроллер beforeFilter.
Я думал об использовании сеанса, но пока не повезло. Вот код:
<?php
if (!isset($_SESSION)) session_start();
class MyShell extends AppShell
{
public function main() {
$_SESSION['toBypassBeforeFilter'] = "true";
CakeLog::write('debug', 'Calculating WIP...');
$this->requestAction('/account/wip_reports');
CakeLog::write('debug', 'Finishing WIP calculations...');
}
}
Журнал отладки выдает первый запрос перед вызовом действия.
2015-10-05 02:08:49 Debug: Calculating WIP...
Но не второй, когда этот вызов действия сделан. Что я пропустил?
РЕДАКТИРОВАТЬ
Похоже, что вызов requestAction() на маршрут не распознается, хотя я все еще могу запустить его в браузере. Может быть, это был другой маршрут?
Вообще говоря, использование requestAction
является индикатором плохой архитектуры приложения. Правильный подход к выполнению заданий cron с CakePHP заключается в том, чтобы написать процесс cli, который вызывает методы, которые на самом деле делают вещи напрямую, не имея процесса cli, который имитирует HTTP-запрос.
В контексте cli оболочка - это код контроллера - контроллера всегда должен храниться в миниуме. Если в настоящее время у вас есть это:
class MyShell extends AppShell
{
public function main()
{
$this->requestAction('/account/wip_reports');
}
}
И это:
class AccountsController extends AppController
{
public function wip_reports()
{
... some code ...
}
}
В принципе, что вам нужно, так это:
class MyShell extends AppShell
{
public function main()
{
$account = ClassRegistry::init('Account');
$account->something();
}
И это:
class AccountsController extends AppController
{
public function wip_reports()
{
$this->Account->something();
}
}
Со всей соответствующей логикой в модели:
class Account extends AppModel
{
public function something()
{
... some code ...
}
}
Таким образом, оболочка вообще не зависит от контроллера или даже не взаимодействует с ним - он просто вызывает те же методы, что и метод действия контроллера.
Ну, вы злоупотребляете контроллером за то, о чем не думали, и теперь вам приходится сталкиваться с результатами этого злоупотребления. Сессия также не будет доступна в среде оболочки.
Обновите свой код, чтобы бизнес-логика находилась в модели или другом классе, который можно вызывать из оболочки оболочки и не имеет зависимости от веб-среды.