Как я могу загрузить класс поставщика как Сервис в Symfony 4? - PullRequest
0 голосов
/ 26 октября 2018

Я использую класс jwt firebase в проекте, его путь вендора:

vendor\firebase\php-jwt\src\jwt

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

Я должен сделать это в файле service.yml:

#services.yaml    
services:
    Firebase:
        class: '../vendor\firebase\php-jwt\JWT'

Это класс, который я создал:

<?php

namespace App\Helpers;

use Firebase\JWT\JWT;

use Symfony\Component\HttpKernel\KernelInterface;

class simpleJwt
{
    private $encrypt = 'RS256';

    function __construct(KernelInterface $kernel, JWT $JWT )
    {
        $this->rootDir = $kernel->getProjectDir();
        $this->jwt = $JWT;
    }
}

Когда я пытаюсь загрузить его, я получаю эту ошибку:

Cannot autowire service "App\Helpers\simpleJwt": argument "$JWT" of method "__construct()" references class "Firebase\JWT\JWT" but no such service exists. 

Спасибо

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Возможно, пакет, который вы пытаетесь импортировать, может быть несовместим с автопроводом Symfony. Обязательно используйте самую последнюю версию пакета (более новые версии могут быть совместимы). В случае, если вы уже используете последнюю версию, вам может понадобиться создать псевдоним для этого пакета в вашем services.yaml, чтобы вы могли использовать его позже в своих классах. Вы можете использовать bin / console debug: container, чтобы проверить, какие службы доступны, и вручную создать псевдоним для нужной вам службы. Бывает, что autowire обычно отключается в большинстве комплектов поставщиков.

0 голосов
/ 03 июля 2019

Просто добавьте полное пространство имен в config.yaml

services:

    Firebase\JWT\JWT:

Вы также можете предоставить требования к конструктору сервисов, используя аргументы:

services:

    Namespace\Domain\ServiceName:
        arguments:
            - '@Another\Namespace\Class'
            - '@service.name'
            - '%parameter%'

Более подробная информация и функции в официальной документации: Сервисный контейнер (Symfony Docs)

Обратите внимание, что вы будете получать доступ к своему сервису через AutoWiring и что вы не будете получать к нему доступ напрямую через контейнер, поскольку аргумент public public по умолчанию имеет значение false (public: true не рекомендуется согласно документации Symfony ).

0 голосов
/ 26 октября 2018

Попробуйте добавить 'autowire: true' в ваш services.yaml, прямо под 'class: ../vendor\firebase\php-jwt\JWT'

...