Наворотили моделей, конфигурацию, и еще кучу завязанной на фреймворк бизнес-логики на вашем сайте, а потом вдруг оказалось, что нужно добавить несколько скриптов, которые бы запускались по крону для решения тяжелых задач? Давайте попробуем сделать так чтобы весь этот функционал, в т.ч. контроллеры, можно было запускать из консольного скрипта. Данный способ представляет из себя компромисс между практичностью и гипертрофированным чувством прекрасного, свойственным архитектуре Symfony в целом.
1. Создаем контроллер
Чтобы писать код нашего скрипта так же, как и в остальном веб-приложении, нам нужен контроллер.
php app/console generate:controller --no-interaction --controller=CronBundle:CronController
На том пока с контроллером и закончим.
2. Создаем маршруты
Создадим маршрут для экшена в котором будет находиться логика. Откроем routes.yml и добавим:
cron_action: pattern: /cron/cron_action defaults: { _controller: CronBundle:Cron:cron }
3. Правим контроллер
Код контроллера должен быть примерно таким:
<?php namespace App\CronBundle\Controller; use Symfony\Component\HttpFoundation\Response; class CronController extends Controller { public function __construct() { /* проверяем что контроллер вызывается из скрипта а не через http-запрос, вместо 'cron_script.php' подставьте имя файла скрипта который будет запускаться через cron */ if ($_SERVER["SCRIPT_NAME"] != "cron_script.php") { print("disallowed"); exit(); } } public function cronAction() { /* здесь логика вашего скрипта */ // чтобы не было ошибки return new Response(''); } }
4. Создаем скрипт для запуска
В корневой директории проекта, там где находится src/, создайте папку с названием scripts, а в ней файл с именем cron_script.php. Его содержимое должно быть таким:
<?php use Symfony\Component\ClassLoader\ApcClassLoader; use Symfony\Component\HttpFoundation\Request; $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; require_once __DIR__.'/../app/AppKernel.php'; $kernel = new AppKernel('prod', false); $kernel->loadClassCache(); // вместо '/cron/cron_action' должно быть URL маршрута который вы выбрали для экшена с логикой, // именно URL, а не имя маршрута $request = Request::create('/cron/cron_action'); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response);
Этот файл и нужно будет подсунуть крону.Теперь можно использовать всю мощь Symfony и во вспомогательных скриптах.
ссылка на оригинал статьи http://habrahabr.ru/post/189968/
Добавить комментарий