我正在尝试在CakePHP 2.x应用程序上使用guzzle 6.x。
我需要做的是将 Guzzle 客户端初始化到我的一些控制器,但在将要加载它的控制器上,我需要使用相同的配置加载它。
基本上我不知道的是哪种是实现它的最佳方法。我在想以下几点:
- 我应该在
AppController
创建一个函数来创建并返回一个 Guzzle 对象,然后将其保存到AppController
中的受保护属性吗?也许像setUpGuzzle()
这样的函数并在我需要加载 Guzzle 客户端的控制器上调用此函数。 - 我应该创建一个组件,然后将 Guzzle 客户端加载到该组件的公共属性中。然后我可以像这样使用它
$this->HttpClient->client->post()
- 我应该创建一个组件并为每个 Guzzle 公共函数编写一个函数吗?所以我会有这样的东西
$this->HttpClient->post()
. - 问题是我不喜欢上述任何一种,我正在跳跃,也许还有另一种方法可以做到这一点。例如,创建一个组件,用于在控制器中加载 Guzzle 客户端或在组件集合中加载 Guzzle 客户端。
你真的需要Guzzle吗?我同意旧的 Cake2 HTTP 套接字是老式的,但它有什么不能做的需要你添加另一个库吗?
使用一个特质,只要你不拘泥于古老的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;
}
}
如果您需要更改配置或整个套接字实现ion,您只需在一个地方更改它,而无需组件的开销。此外,这可以用于任何类,而不仅仅是控制器。您正在寻找的或多或少是一个简单的工厂式方法,不需要整个控制器。
如果您不能使用特征,那么您将不得不使用组件,或者只是将上面的代码放在一个组件中,而不是在特征或组件中,而是直接放在您的 AppController 中,但您将无法在继承该控制器的控制器范围之外使用它。