Как я могу обобщить ApiKeyAuthenticator в Symfony 4?

У меня есть следующий код, который проверяет правильность 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
    }
}

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

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 $request;
    private $route;
    private $entity;

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

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

        if ($this->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()); //notice here
    }

}

Затем я меняю код file1Controller.php на:

<?php


namespace App\Controller;

require(__DIR__.'/../General.php'); //note that there's no error accessing the file here
use Symfony\Component\HttpFoundation\Request;

class file1Controller
{

    /**
     * @param Request $request
     */
    public function AuthenticateAPI(Request $request)
    {
        $AuthenticatorObject = new ApiKeyAuthenticator($request, "/Some/URI", 'Something'); //getting undefiend class 
        return $AuthenticatorObject;
    }

}

К сожалению, это не работает при тестировании с помощью Postman, и я получаю ошибку класса undefiend в этой строке $AuthenticatorObject = new ApiKeyAuthenticator($request, "/Some/URI", 'Something'); в file1Controller.php

Что я сделал не так и как я могу это исправить?

Может быть, что-то не так с самим Postman?

user8678484 08.06.2019 14:55

@Doesitmatter Нет. Код даже не компилируется в PHPStorm.

user11480180 08.06.2019 15:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не должны вызывать свои контроллеры так в Symfony:

require(__DIR__.'/../General.php'); //note that there's no error accessing the file here

Пожалуйста, ознакомьтесь с определением и доступом к контроллерам как к сервису в документации Symfony:

Как определить контроллеры как службы

Как перенаправить запросы другому контроллеру

Все в папке src будет использовать пространство имен App. например, если есть HelloController, вы должны использовать use App\Controller\HelloController;

Ali Kazemi 08.06.2019 16:14

где находится файл General.php?

Ali Kazemi 08.06.2019 16:22

Другие вопросы по теме