Как я могу использовать метод учения в моем сервисе (Symfony 4)? - PullRequest
0 голосов
/ 05 марта 2019

Я создал свой первый собственный сервис в Symfony:

// src/Service/PagesGenerator.php 

namespace App\Service;

class PagesGenerator
{
    public function getPages()
    {

      $page = $this->getDoctrine()->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);

        $messages = [
            'You did it! You updated the system! Amazing!',
            'That was one of the coolest updates I\'ve seen all day!',
            'Great work! Keep going!',
        ];

        $index = array_rand($messages);

        return $messages[$index];
    }
}

Но я получаю сообщение об ошибке:

Попытка вызова неопределенного метода с именем"getDoctrine" класса "App \ Service \ PagesGenerator".

Затем я попытался добавить в свои services.yaml:

PagesGenerator:
    class: %PagesGenerator.class%
    arguments:
      - "@doctrine.orm.entity_manager"

Но затем я получаю сообщение об ошибке:

Файл "/Users/work/project/config/services.yaml" не содержит действительный YAML в /Users/work/project/config/services.yaml (который загружается в ресурс "/Users/work/project/config/services.yaml").

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Итак, в комментариях я говорил, что лучше позволить Symfony выполнять свою работу и выполнять автоматическую разводку EntityManager.Это то, что вы должны сделать.Кроме того, можете ли вы сказать нам, какую версию Symfony вы используете и включена ли автоматическая разводка (для этого проверьте services.yaml)?

<?php

namespace App\Service;

use Doctrine\ORM\EntityManagerInterface;

class PagesGenerator
{
    public function __construct(EntityManagerInterface $em) {
        $this->em = $em;
    }

    public function getPages()
    {

      $page = $this->em->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);

        $messages = [
            'You did it! You updated the system! Amazing!',
            'That was one of the coolest updates I\'ve seen all day!',
            'Great work! Keep going!',
        ];

        $index = array_rand($messages);

        return $messages[$index];
    }
}
0 голосов
/ 05 марта 2019

С Symfony 4 и новым автоматическим подключением вы можете легко ввести определенное число класса

Чтобы узнать, какие классы / интерфейс вы можете использовать для автоматического подключения, используйте эту команду:

bin/console   debug:autowiring 

Мы собираемся использовать это:

Doctrine \ ORM \ EntityManagerInterface (doctrine.orm.default_entity_manager)

Итак, давайте сделаем это, добавим это непосредственно перед функцией getPages

/**
 * @var EntityManagerInterface
 */
private $em;

public function __construct(EntityManagerInterface $em)
{
    $this->em = $em;
}

Тогда вы можете использовать это так:

  $page = $this->em->getRepository(Pages::class)->findOneBy(['slug'=>$slug]);

Надеюсь, это поможет!

0 голосов
/ 05 марта 2019

убедитесь, что вы используете правильный отступ, используя «пробелы» для YAML.

В файле YAML в качестве отступа используются пробелы, для отступа можно использовать 2 или 4 пробела, но без табуляции Подробнее об этом

До Symfony 3.3

, например, у нас есть сервис sms_manager in AppBundle/FrontEndBundle/Services

services:
    AppBundle.sms_manager:
        class: AppBundle\FrontEndBundle\Services\SmsManager
        arguments: [ '@service_container' ,'@doctrine.orm.entity_manager' ]

тогда ваш сервис может получить ваши аргументы в конструкторе

<?php

namespace AppBundle\FrontEndBundle\Services;

use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class SmsManager {
    private $container;
    private $DM;

    public function __construct( Container $container, \Doctrine\ORM\EntityManager $DM ) 
    {
        $this->container = $container;
        $this->DM        = $DM;
    }

    /**
    * @return \Doctrine\ORM\EntityManager
    */

    public function getDoctrine() {
      return $this->DM;
    }

}

С Symfony 3.3 или более,

Есть ли способвнедрить EntityManager в сервис

use Doctrine\ORM\EntityManagerInterface

class PagesGenerator
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

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