在 CakePHP 中使用 guzzle 2.x

Using guzzle with CakePHP 2.x

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

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

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

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

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

使用 trait,只要您不拘泥于古老的 php 版本,这是一个干净的解决方案。这里有一些 pseudo-code 可以为您提供高层次的想法:

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;
    }
}

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

如果你不能使用一个特征,那么你将不得不使用一个组件,或者只是将上面的代码不放在特征或组件中,而是直接放在你的 AppController 中,但你将无法使用它超出了继承该控制器的控制器的范围。