适用于所有其他API控制器的Symfony 4基本控制器类

elv*_*dev 0 php api controller symfony symfony4

在我的Symfony 4应用程序中,我需要有一个多个控制器,每个控制器用于在不同的前缀中挂载/分组各种API端点.

每个控制器都需要先进行初始化,然后在API客户端的类属性中设置并设置凭据.为了避免代码重复所有这些,我想创建一个BaseController,以便其他人可以扩展并直接访问或拥有他需要的所有客户端属性.

基础控制器:

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Vendor\ApiClient;

class BaseApiController extends Controller
{
    /**
     * @var ApiClient
     */
    protected $apiClient;

    public function __construct( array $apiClientCredentials, ApiClient $apiClient )
    {
        $this->apiClient = $apiClient;
        $this->apiClient->credentials($apiClientCredentials['id'], $apiClientCredentials['main_password']);
    }

}
Run Code Online (Sandbox Code Playgroud)

我希望能够调用/使用API​​属性的众多类似控制器之一:

<?php
namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * Account endpoints
 * @Route("/account")
 */
class AccountApiController extends BaseApiController
{

    /**
     * Get the balance.
     * @Route("/balance", name="balance")
     */
    public function balance()
    {
        return new JsonResponse($this->apiClient->getBalance());
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的,但仍然没有按预期工作,想知道将这种设置放在一起的最佳做法是什么?

编辑:这是我收到的错误消息.

Cannot autowire service "App\Controller\AccountApiController": argument "$apiClientCredentials" of method "App\Controller\BaseApiController::__construct()" must have a type-hint or be given a value explicitly.
Run Code Online (Sandbox Code Playgroud)

编辑:添加我的 services.yaml

# config/services.yaml
parameters:
    app.creds:
        id: '%env(ACCOUNT_ID)%'
        main_password: '%env(ACCOUNT_MAIN_PASSWORD)%'
# ...
services:
    _defaults:
        autowire: true
    # ...
    App\Controller\BaseApiController:
        arguments:
            $apiClientCredentials: '%app.creds%'
Run Code Online (Sandbox Code Playgroud)

Sha*_*are 5

您需要保护APiClient的范围

/**
 * @var ApiClient
 */
protected $apiClient;
Run Code Online (Sandbox Code Playgroud)