在我的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%'
答案 0 :(得分:5)
您的APiClient范围需要受到保护
/**
* @var ApiClient
*/
protected $apiClient;
答案 1 :(得分:0)
由于我现在在多个控制器中使用它似乎现在只是对这个论点进行约束。
abstract class BaseApiController extends Controller
{
//...
基类也必须是抽象的:
$('checkout').trigger('click');