Symfony 4 Как автоматически связать строки при создании общего класса? - PullRequest
1 голос
/ 08 июня 2019

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

У меня есть следующий код для контроллера, чтобы проверить ключ API перед отправкой данных из бэкэнда во внешний интерфейс.

file1Controller.php

<?php


namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class file1Controller extends AbstractController
{

    /**
     * @Route("/Some/URI", methods={"GET"}) // "/Some/URI" here
     * @param Request $request
     * @return JsonResponse
     */
    public function list(Request $request)
    {
        if (empty($request->headers->get('api-key'))) {
            return new JsonResponse(['error' => 'Please provide an API_key'], 401);
        }

        if ($request->headers->get('api-key') !== $_ENV['API_KEY']) {
            return new JsonResponse(['error' => 'Invalid API key'], 401);
        }

        return new JsonResponse($this->getDoctrine()->getRepository('App:Something')->findAll()); //Something here
    }
}

Который работает точно так, как задумано (протестировал его с Почтальоном и с моим браузером) для моего простого примера обучения. Я хотел бы обобщить это так, чтобы я мог использовать это в других местах. Почти все должно оставаться прежним, кроме частей, где есть комментарии. Это то, что становится, когда оно становится общим:

General.php

<?php


namespace App;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;


class General extends AbstractController
{

    private $route;
    private $entity;

    /**
     * General constructor.
     * @param String $route
     * @param String $entity
     */
    function __construct(String $route, String $entity)
    {
        $this->route = $route;
        $this->entity = $entity;
    }

    /**
     * @Route({$this->route}, methods={"GET"})
     * @param Request $request
     * @return JsonResponse
     */
    public function list(Request $request)
    {
        if (empty($request->headers->get('api-key'))) {
            return new JsonResponse(['error' => 'Please provide an API_key'], 401);
        }

        if ($request->headers->get('api-key') !== $_ENV['API_KEY']) {
            return new JsonResponse(['error' => 'Invalid API key'], 401);
        }

        return new JsonResponse($this->getDoctrine()->getRepository('App:{$this->entity}')->findAll());
    }

}

И файл file1Controller.php меняется на:

<?php


namespace App\Controller;

use App\General;
use Symfony\Component\HttpFoundation\Request;

class SubscriptionController
{

    /**
     * @return General
     */
    public function AuthenticateAPI()
    {
        $generalObject = new General("/Some/URI", 'Something');
        return $generalObject;
    }

}

Эта новая установка не дает ошибок компилятора, но, конечно, выдает следующую ошибку (при тестировании):

Невозможно автоматически подключить службу "App \ General": аргумент "$ route" метода "__construct ()" является подсказкой типа "строка", вам следует явно настроить его значение.

Я понимаю, что эта ошибка возникает из-за того, что Symfony не знает, какую строку вводить. Но должен быть способ обойти это? Потому что я не могу указать значение явно в моем случае, потому что я буду делать другой файл file2Controller.php, который будет точно таким же, но с другими $route и $entity.

...