我遇到了一个问题,我不知道如何解决它。
我有一个控制器Pusher
,带有方法Auth
class Pusher extends MX_Controller
{
/**
*
*/
public function auth()
{
$this->load->model('pusher/Pusher_model');
$p = $this->Pusher_model->newPusher();
var_dump($p);die;
}
}
我有一个模型Pusher_model
,其中包含一个实例化new Pusher()
对象的方法
require 'vendor/autoload.php';
class Pusher_model extends CI_Model
{
public $options;
/**
*
*/
public function __construct()
{
$this->config->load('api_config');
$this->options = array(
$this->config->item('pusher_cluster'),
$this->config->item('pusher_is_encrypted')
);
}
/**
*
*/
public function newPusher()
{
return new Pusher(
$this->config->item('pusher_public_key'),
$this->config->item('pusher_secret_key'),
$this->config->item('pusher_api_id'),
$this->options
);
}
}
当我在控制器中var_dump()
返回的 Pusher 对象时......
var_dump($p)
结果我得到了整个控制器"推杆"...
object(Pusher)#24 (2) {
["autoload"]=>
array(0) {
}
["load"]=>
object(MY_Loader)#25 (13) {
["_module":protected]=>
string(6) "pusher"
["_ci_plugins"]=>
array(0) {
}
["_ci_cached_vars"]=>
&array(0) {
}
["_ci_ob_level":protected]=>
int(1)
["_ci_view_paths":protected]=>
&array(1) {
["C:xampphtdocsphptwocantwocan_betaAppviews"]=>
bool(true)
}
["_ci_library_paths":protected]=>
&array(2) {
[0]=>
string(43) "C:xampphtdocsphptwocantwocan_betaApp"
[1]=>
string(43) "C:xampphtdocsphptwocantwocan_betaSys"
}
["_ci_model_paths":protected]=>
&array(2) {
[0]=>
string(58) "C:xampphtdocsphptwocantwocan_betaAppmodules/pusher/"
[1]=>
string(43) "C:xampphtdocsphptwocantwocan_betaApp"
}
["_ci_helper_paths":protected]=>
&array(2) {
[0]=>
string(43) "C:xampphtdocsphptwocantwocan_betaApp"
[1]=>
string(43) "C:xampphtdocsphptwocantwocan_betaSys"
}
["_ci_classes":protected]=>
&array(15) {
["benchmark"]=>
string(9) "Benchmark"
["hooks"]=>
string(5) "Hooks"
["config"]=>
string(6) "Config"
["log"]=>
string(3) "Log"
["utf8"]=>
string(4) "Utf8"
["uri"]=>
string(3) "URI"
["router"]=>
string(6) "Router"
["output"]=>
string(6) "Output"
["security"]=>
string(8) "Security"
["input"]=>
string(5) "Input"
["lang"]=>
string(4) "Lang"
["loader"]=>
string(6) "Loader"
["session"]=>
string(7) "Session"
["form_validation"]=>
string(15) "Form_validation"
["model"]=>
string(5) "Model"
}
["_ci_models":protected]=>
&array(1) {
[0]=>
string(12) "Pusher_model"
}
["_ci_helpers":protected]=>
&array(5) {
["url_helper"]=>
bool(true)
["html_helper"]=>
bool(true)
["security_helper"]=>
bool(true)
["language_helper"]=>
bool(true)
["form_helper"]=>
bool(true)
}
["_ci_varmap":protected]=>
&array(2) {
["unit_test"]=>
string(4) "unit"
["user_agent"]=>
string(5) "agent"
}
["controller"]=>
*RECURSION*
}
}
这让我相信实例化对象和控制器本身存在名称冲突。
问:
如何在不重命名控制器的情况下解决此冲突,或者是否必须对通过该控制器实例化的任何对象使用不同的控制器名称?
如何在不重命名控制器的情况下解决此冲突,还是必须对通过该控制器实例化的任何对象使用不同的控制器名称?
好吧,让我们看看..
- 控制器称为:
Pusher->auth()
- 控制器加载并调用模型:
$this->Pusher_model->newPusher();
- 然后,您将使用
return new Pusher
实例化一个新的 Pusher 对象并将其返回到Pusher
控制器。 - 这意味着您的
Pusher
控制器具有包含新推送器对象的属性$p
- 是的,你在这里兜圈子。
我建议保持简单:
-
不要实例化
new Pusher
,而只是将连接数据从模型(Pusher_model
)返回给控制器,例如public function newPusher() { return array( $this->config->item('pusher_public_key'), $this->config->item('pusher_secret_key'), $this->config->item('pusher_api_id'), $this->options ); }
-
还可以将方法重命名为"
getCredentials
"或"getApiConfig
- 这意味着
$p
是一个数组,您可以使用控制器中的数据Psuher
来设置 API 以便以后对其进行调用
另一种选择是在控制器和模型之间引入服务层:
- 新类
PusherAPIService
- 在
controller
中实例化 - 在控制器调用
model->getCredentials
中 - 设置/传递凭据以
PusherAPIService
,例如configure($credentials)
- 向
PusherAPIService
添加操作,例如connect()
、pull()
,push()
你的服务做什么。这意味着服务类包装与外部 API 的所有交互。 - 例如,当 POST 请求进来时,让控制器处理传入的数据,然后将数据注入服务层,然后在现在配置的服务上调用方法,将结果返回控制器。