Сохранение данных в базе данных с помощью консольной команды - PullRequest
0 голосов
/ 01 февраля 2019

Я создал консольную команду, но во время выполнения я получаю следующую ошибку:

In ControllerTrait.php line 338:

  Call to a member function has() on null 

DatabaseHelper.php

<?php

namespace App\Controller;

use App\Entity\Currency;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Controller\CurrencyComparison;

class DatabaseHelper extends AbstractController
{
    public function insertValues()
    {
        $curFromAPI = new CurrencyComparison();
        $curFromAPI = $curFromAPI->compareCurrencies();

        $date = new \DateTime('@'.strtotime('now'));
        $entityManager = $this->getDoctrine()->getManager();

        $currency = new Currency();
        $currency->setName('USD');
        $currency->setAsk($curFromAPI->getUSD());
        $currency->setLastUpdated($date);
        $entityManager->persist($currency);
        $entityManager->flush();
    }
}

CurrencyComparison.php

<?php

namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

use App\Service\DatabaseHelper;

class CurrencyComparison extends Command
{
    private $databaseHelper;

    public function __construct(DatabaseHelper $databaseHelper){
        $this->$databaseHelper = $databaseHelper;

        parent::__construct();
    }

    protected function configure()
    {

        $this
            ->setName('app:currency-comparison')
            ->setDescription('Inserts currencies into the database.')
            ->setHelp('Compares currencies from APIs and inserts the lower rates into the database.')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->databaseHelper->insertValues();

        $output->writeln([
            'Currencies are being inserted into the database',
            '============',
            '',
        ]);

        $output->writeln('Done.');
    }
}

При отладке заметил, что я получаю эту ошибку после следующей строки в DatabaseHelper.php:

$entityManager = $this->getDoctrine()->getManager();

Что я должен изменить или должен искатьfor?

Спасибо.

- ОБНОВЛЕНИЕ - Я создал Службу и попытался внедрить EntityManager как конструкцию.

App / Service / DatabaseHelper.php

<?php

namespace App\Service;

use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;


class DatabaseHelper extends AbstractController
{
    private $entityManager;

    public function __construct(EntityManager $entityManager){
        $this->entityManager = $entityManager;
    }

    public function insertValues()
    {

        $curFromAPI = new CurrencyComparison();
        $curFromAPI = $curFromAPI->compareCurrencies();

        $date = new \DateTime('@'.strtotime('now'));
        $this->entityManager = $this->getDoctrine()->getManager();
        return dd($curFromAPI);
        $currency = new Currency();
        $currency->setName('USD');
        $currency->setAsk($curFromAPI->getUSD());
        $currency->setLastUpdated($date);
        $entityManager->persist($currency);

        // actually executes the queries (i.e. the INSERT query)
        $entityManager->flush();

     }
}

и обновленный Command \ CurrencyComparison.php тоже.Но когда я пытаюсь вызвать функцию execute для CurrencyComparison.php, я не могу достичь ее функции '$this->databaseHelper->insertValues();.Не могли бы вы дать какие-либо предложения?

- ОБНОВЛЕНИЕ & Решение -

  • Удалено расширяет AbstractController из класса DatabaseHelper.

  • Изменен __construct DatabaseHelper и введен следующим образом: (EntityManagerInterface $entityManager)

  • удалил следующую строку из функции insertValues ​​в DatabaseHelper.php: $this->entityManager = $this->getDoctrine()->getManager(); и просто использовал функции сохранения и сброса, как указано выше.

1 Ответ

0 голосов
/ 01 февраля 2019

Поскольку ваша команда имеет зависимость от DatabaseHelper, которая зависит от Entity Manager, создайте класс DatabaseHelper в качестве службы, с Entity manager, внедренным через его конструктор (автоматически связывайте его или укажите вего определение службы).

затем, согласно документам здесь , вы можете добавить службу DatabaseHelper в команду через конструктор, так как она будет автоматически подключена по умолчанию.

Я бы также рассмотрел , а не , расширяющий AbstractController, поскольку ваш DatabaseHelper очень узок по объему и не будет нуждаться во всем контейнере (при условии, что он содержит только то, что вы опубликовали).Просто введите то, что вам нужно.

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