[Symfony5] Entity autowiring nie chce działać

[Symfony5] Entity autowiring nie chce działać
NO
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 2 lata
  • Postów:430
0

Cześć,
Mam metodę kontrolera:

Kopiuj
/**
     * @Route("/{id}", methods={"GET"}, name="get")
     * @param Product $product
     * @return JsonResponse
     */
    public function getProduct(Product $product)
    {
        return new JsonResponse($this->serialize($product));
    }

Oraz encję:

Kopiuj
/**
 * @ORM\Entity(repositoryClass=ProductRepository::class)
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Serializer\Expose()
     * @Serializer\Groups({"default"})
     * @Serializer\Type("integer")
     */
    private int $id;

    /**
     * @ORM\Column(type="string", length=80)
     * @Serializer\Expose()
     * @Serializer\Groups({"default"})
     * @Serializer\Type("string")
     */
    private string $name;

    /**
     * @ORM\Column(type="text", nullable=true)
     * @Serializer\Expose()
     * @Serializer\Groups({"default"})
     * @Serializer\Type("string")
     */
    private string $comment = 'test';

    /**
     * @ORM\Column(type="integer")
     * @Serializer\Expose()
     * @Serializer\Groups({"default"})
     * @Serializer\Type("integer")
     */
    private int $kcal;

    /**
     * @ORM\Column(type="float")
     * @Serializer\Expose()
     * @Serializer\Groups({"default"})
     * @Serializer\Type("float")
     */
    private float $protein;

    /**
     * @ORM\Column(type="float")
     * @Serializer\Expose()
     * @Serializer\Groups({"default"})
     * @Serializer\Type("float")
     */
    private float $cab;

    /**
     * @ORM\Column(type="float")
     * @Serializer\Expose()
     * @Serializer\Groups({"default"})
     * @Serializer\Type("float")
     */
    private float $fat;

    /**
     * @ORM\OneToMany(targetEntity=MealProduct::class, mappedBy="product")
     */
    private PersistentCollection  $mealProducts;

    ...
}

Niestety, gdy próbuję odwołać się do strony product/{id} dostaję błąd:

Kopiuj
Cannot autowire argument $product of "App\Controller\Product\ProductController::getProduct()": it references class "App\Entity\Product" but no such service exists.

Encje są wykluczone z bycia używanych jako serwisy w configu (tak powinno być):

Kopiuj
parameters:

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: false # Automatically registers your services as commands, event subscribers, etc.

    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'
            - '../src/Tests/'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller/'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

Już trochę nie wiem o co może chodzić. Wiem że mogę użyć ParamConverter'a albo wstrzyknąć EntityManager, ale wolę podejście w którym od razu dostaję encje.
Co dziwne, w innym projekcie (framework bundle 5.1.6) działa to bez problemu, natomiast na 5.1.8 za nic nie chce zadziałać.
Macie jakiś pomysł, co może być nie tak? Pytałem na symfony'owym slacku, ale nikt nie staty nie wpadł jaka może być przyczyna.
Na wszelki podrzucam jeszcze paczki których używam, może tam mam jakiś brak (używam symfony-skeleton):

Kopiuj
"require": {
        "php": ">=7.4.3",
        "ext-ctype": "*",
        "ext-iconv": "*",
        "composer/package-versions-deprecated": "1.11.99.1",
        "doctrine/annotations": "^1.11",
        "doctrine/doctrine-bundle": "^2.2",
        "doctrine/doctrine-migrations-bundle": "^3.0",
        "doctrine/orm": "^2.7",
        "jms/serializer": "^3.10",
        "symfony/console": "5.1.*",
        "symfony/dotenv": "5.1.*",
        "symfony/flex": "^1.3.1",
        "symfony/framework-bundle": "5.1.*",
        "symfony/yaml": "5.1.*"
    },
    "require-dev": {
        "symfony/maker-bundle": "^1.23",
        "symfony/stopwatch": "^5.1",
        "symfony/twig-bundle": "^5.1",
        "symfony/web-profiler-bundle": "^5.1"
    },
edytowany 1x, ostatnio: NickOver
serek
  • Rejestracja:około 11 lat
  • Ostatnio:22 minuty
  • Postów:1475
0

No ale przecież teraz też używasz Param Convertera, by zamienić ID na obiekt. (chyba że masz wyłączony w configu?). Domyślnie nie trzeba definiować w adnotacji, że używasz Param Convertera, dla prostych przypadków Symfony zrobi to w locie. Sprawdź, czy nie masz przypadkiem wyłączonego:

Kopiuj
sensio_framework_extra:
    request:
        converters: true
        auto_convert: false
edytowany 1x, ostatnio: serek
NO
Tak, szukając przyczyny wyłączyłem auto_convert, mimo true cały czas wywala ten sam błąd. No tak, używam, ale nie muszę tego definiować w anotacjach.
NO
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 2 lata
  • Postów:430
0

Dobra, problem rozwiązany. Okazało się że nie miałem sensio/framework-extra-bundle.

serek
Czyli prawie zgadłem xD

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.