【问题标题】:Using guzzle with CakePHP 2.x在 CakePHP 2.x 中使用 guzzle
【发布时间】:2016-05-01 20:55:44
【问题描述】:

我正在尝试在 CakePHP 2.x 应用程序上使用 guzzle 6.x

我需要做的是将 Guzzle Client 初始化为我的一些控制器,但在将要加载它的控制器上,我需要使用相同的配置加载它。

基本上我不知道哪种是实现它的最佳方法。我正在考虑以下问题:

  1. 我是否应该在AppController 中创建一个函数,该函数将创建并返回一个Guzzle 对象,然后将其保存到AppController 内的受保护属性中?也许像setUpGuzzle() 这样的函数并在我需要加载 Guzzle 客户端的控制器上调用此函数。
  2. 我是否应该创建一个组件,然后将 Guzzle 客户端加载到该组件的公共属性中。然后我可以像这样使用它$this->HttpClient->client->post()
  3. 我应该为每个 Guzzle 公共函数创建一个组件并编写一个函数吗?所以我会有这样的东西$this->HttpClient->post()
  4. 问题是我不喜欢上述任何一种方法,我在想也许还有其他方法可以做到这一点。例如,创建一个在控制器中加载 Guzzle 客户端或在组件集合中加载 Guzzle 客户端的组件。

【问题讨论】:

    标签: php cakephp guzzle cakephp-2.x


    【解决方案1】:

    你真的需要 Guzzle 吗?我同意旧的 Cake2 HTTP 套接字是老式的,但是它不能做的事情需要你添加另一个库吗?

    使用 trait,只要您不拘泥于古老的 php 版本,这是一个干净的解决方案。下面是一些伪代码,可以为您提供高级别的想法:

    trait HttpSocket {
        protected $_httpSocket = null;
        protected $_httpSocketConfig = [
            // Default config goes here
        ];
        public function getHttpSocket() {
            if (empty($this->_httpSocket)) {
                // Not sure how the constructur works, so it's just an example
                $this->_httpSocket = new Guzzle($this->_httpSocketConfig);
            }
            return $this->_httpSocket;
        }
    }
    

    如果您需要更改配置或整个套接字实现,您只需在一个地方更改它,而无需组件的开销。这也可以在任何类中使用,而不仅仅是控制器。您正在寻找的或多或少是一个类似工厂的简单方法,不需要整个控制器。

    如果您不能使用 trait,那么您将不得不使用组件,或者只是将上面的代码不放在 trait 或组件中,而是直接放在 AppController 中,但您将无法在外部使用它然后继承该控制器的控制器的范围。

    【讨论】:

    • 没有办法将Guzzle Client注册为组件吗?
    • 如果您对将它用作组件如此着迷,只需将相同的代码应用于组件或创建代理以通过神奇的 __call() 方法在组件内部大吃一惊。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2018-09-13
    • 2014-02-07
    • 1970-01-01
    相关资源
    最近更新 更多