【发布时间】:2018-09-09 20:21:34
【问题描述】:
在我的 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']);
}
}
我想让 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());
}
}
这就是我所拥有的,但仍然无法按预期工作,想知道如何将这个设置放在一起的最佳实践?
编辑:这是我收到的错误消息。
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.
编辑:添加我的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%'
【问题讨论】:
标签: php api symfony controller symfony4