【问题标题】:Hide Restler method from swagger-ui从 swagger-ui 中隐藏 Restler 方法
【发布时间】:2014-09-21 04:26:35
【问题描述】:

使用内部封装 swagger-ui 的 Restler 3.0.0-RC6,我有一个 API 方法定义如下:

<?php

namespace v1:

class PostgreSQL {
    public function fetchArray($sql, $args = null) {

然后我通过 Restler 的 addAPIClass 包含的所有类都扩展了该 PostgreSQL 类。这意味着当 swagger 运行时,每个 API 都会显示一个 fetchArray 函数。我希望该方法 not 出现在 swagger 文档中,因为它实际上并不是 API 的一部分。网站上的其他“事物”也使用该类,因此我无法将修饰符从 public 更改。

从 swagger-ui 的网页中隐藏该方法的正确语法是什么?

【问题讨论】:

    标签: php restler swagger-ui


    【解决方案1】:

    有两种方法可以实现,

    一种是使用@access private 注释将fetchArray 方法标记为私有。这将从所有 api url 中删除 fetchArray,同时保持 fetchArray 仍然可供 PHP 访问

    您的问题是您不想将 PostgreSQL 修改为由 composer 维护的框架的一部分。不要直接从基类扩展它,而是使用一个添加注释的中间类,然后扩展该类,如下所示

    class Base {
        public function fetchArray(){
            return array();
        }
    }
    
    class Intermediary extends Base {
        /**
         * @access private
         */
        public function fetchArray(){
            return array();
        }
    }
    
    class MyApi extends Intermediary { //instead of extends Base
        //other api methods here
        //see in the explorer to note that fetchArray is no longer listed
    }
    

    另一种方法是在资源管理器中排除它

    use Luracast\Restler\Explorer;
    Explorer::$excludedPaths = array('myapi/fetcharray','another/fetcharray');
    

    【讨论】:

      【解决方案2】:

      您不应从数据层类扩展您的 API 层类。只需使用数据层类即可。

      class DataLayer
      {
        public function fetchArray()
        {
          return array();
        }
      }
      
      class ApiLayer
      {
        private $dl;
      
        function __construct()
        {
          $this->dl = new DataLayer();
        }
      
        public function getAll()
        {
          return $this->dl->fetchArray();
        }
      }
      

      【讨论】: