Консольное приложение из сайта на Symfony2

от автора

    Наворотили моделей, конфигурацию, и еще кучу завязанной на фреймворк бизнес-логики на вашем сайте, а потом вдруг оказалось, что нужно добавить несколько скриптов, которые бы запускались по крону для решения тяжелых задач? Давайте попробуем сделать так чтобы весь этот функционал, в т.ч. контроллеры, можно было запускать из консольного скрипта. Данный способ представляет из себя компромисс между практичностью и гипертрофированным чувством прекрасного, свойственным архитектуре 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *