【问题标题】:Symfony 4 base controller class for all other API controllers用于所有其他 API 控制器的 Symfony 4 基本控制器类
【发布时间】: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


    【解决方案1】:

    由于我要在多个控制器中使用它,现在看来只绑定参数是公平的。

    services:
        _defaults:
            autowire: true      
            autoconfigure: true 
            public: false      
            bind:
                $walletCreds: '%app.wallet_creds%'
    

    基类也必须是抽象的:

    abstract class BaseApiController extends Controller
    {
    //...
    

    【讨论】:

      【解决方案2】:

      需要保护 APiClient 的范围

      /**
       * @var ApiClient
       */
      protected $apiClient;
      

      【讨论】:

      • 你说得对,我的 $apiClient 范围错误,现在我已将代码中的范围更改为 protected。但是,这不是我问题的原因或解决方案。如果这有助于提供更多上下文,请参阅我在上面添加的错误消息。
      猜你喜欢
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      相关资源
      最近更新 更多