CakePHP - команда оболочки не может обойтись перед фильтром

1

Я пытаюсь создать 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() на маршрут не распознается, хотя я все еще могу запустить его в браузере. Может быть, это был другой маршрут?

Теги:
cakephp

2 ответа

3
Лучший ответ

Не вызывайте контроллеры из процессов cli

Вообще говоря, использование 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 ...
    }
}

Таким образом, оболочка вообще не зависит от контроллера или даже не взаимодействует с ним - он просто вызывает те же методы, что и метод действия контроллера.

1

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

Обновите свой код, чтобы бизнес-логика находилась в модели или другом классе, который можно вызывать из оболочки оболочки и не имеет зависимости от веб-среды.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню