как вызвать конкретный метод из команды bin / console - PullRequest
0 голосов
/ 27 июня 2019

Мне нужно запускать метод контроллера каждые 2 часа.Я где-то читал, что вам нужно создать команду и запустить эту команду с помощью CRON.Это правильно?

MY COMMAND:
namespace AppBundle\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Routing\Annotation\Route;

class RunCommand extends Command
{
    // the name of the command (the part after "bin/console")
    protected static $defaultName = 'app:run';

    protected function configure()
    {
        // ...
    }


    protected function execute(InputInterface $input, OutputInterface $output)
    {
        echo 'BEGIN';

        $controller = new \AppBundle\Controller\DefaultController();
        $controller->storeAction();

        echo 'END';
    }
}


MY CONTROLLER:
/**
 * @Route("/to-db", name="to-db")
 */
public function storeAction()
{
    $entityManager = $this->getDoctrine()->getManager();

    $data = new Skuska();
    $data->setName('Keyboard');
    $entityManager->persist($data);
    $entityManager->flush();

    // die();
}

Моя ошибка: В ControllerTrait.php строка 424: вызов функции-члена имеет () значение NULL

Мой код правильный?Как запустить метод с использованием cron?

Я не хочу использовать другой пакет.Я хочу запрограммировать это сам

1 Ответ

3 голосов
/ 27 июня 2019

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

При конфигурации автозагрузки службы по умолчанию выдаже не нужно заботиться о ваших сервисных декларациях.Ваша команда автоматически станет службой, и вы можете добавить в нее другие службы.
https://symfony.com/doc/current/console/commands_as_services.html

Для контроллеров вам даже не нужно использовать определенный конструктор.
https://symfony.com/doc/current/controller.html#fetching-services

<?php
// AppBundle/Service/StoreService.php

use AppBundle\Entity\Skuska;
use Doctrine\ORM\EntityManager;

class StoreService
{
    /** @var EntityManager */
    private $entityManager;

    /**
     * StoreService constructor.
     * @param EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function store()
    {
        $data = new Skuska();
        $data->setName('Keyboard');
        $this->entityManager->persist($data);
        $this->entityManager->flush();
    }

}
<?php
// AppBundle/Controller/StoreController.php

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Service\StoreService;

class StoreController extends Controller
{
    /**
     * @Route("/to-db", name="to-db")
     * @param StoreService $storeService
     * @return Response
     */
    // Hinting to you service like this should be enough for autoloading.
    // No need for a specific constructor here.
    public function storeAction(StoreService $storeService)
    {
        $storeService->store();
        return new Response(
        // Return something in you response.
        );
    }
}
<?php
// AppBundle/Command/RunCommand.php

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use AppBundle\Service\StoreService;

class RunCommand extends Command
{
    protected static $defaultName = 'app:run';

    /** @var StoreService */
    protected $storeService;

    /**
     * RunCommand constructor.
     * @param StoreService $storeService
     */
    public function __construct(StoreService $storeService)
    {
        $this->storeService = $storeService;
        parent::__construct();
    }

    protected function configure()
    {
        // ...
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        echo 'BEGIN';

        $this->storeService->store();

        echo 'END';
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...