1

在試圖與XenForo鬆散耦合我爾康的應用程序,我想與爾康的DI註冊從XenForo_Model_Thread類的方法是這樣的:如何使用Phalcon的DI註冊類方法?

$di->set('forum', function() { 
    \XenForo_Autoloader::getInstance()->setupAutoloader('../forums/library'); 
    \XenForo_Application::initialize('../forums/library', '../forums', true, array('resetOutputBuffering' => false)); 
    \XenForo_Session::startPublicSession(); 

    $model = \XenForo_Model::create('XenForo_Model_Thread'); 

    $callback = function ($id) use ($model) { 
     return $model->getThreadsInForum($id); 
    }; 

    return $callback; 
}); 

我希望能夠調用此方法從我的控制器是這樣的:

$forum = $this->forum(2); 

顯然這是行不通的。

但這個工程:

$di->set('forum', function() { 
    \XenForo_Autoloader::getInstance()->setupAutoloader('../forums/library'); 
    \XenForo_Application::initialize('../forums/library', '../forums', true, array('resetOutputBuffering' => false)); 
    \XenForo_Session::startPublicSession(); 

    $model = \XenForo_Model::create('XenForo_Model_Thread'); 

    return array($model, 'getThreadsInForum'); 
}); 

然後,我可以從控制器做到這一點:

$forum = call_user_func($this->forum, 2); 

我討厭雖然弄亂我的這個古怪的代碼。有一個更好的方法嗎?

+0

你嘗試'$二>設置( '論壇',函數($ ID){'?我還沒有嘗試過,只是一個想法。 – 2014-10-01 04:41:38

+0

@NikolaosDimopoulos是的,通過PHP拋出錯誤的是「調用未定義的方法論壇()」 – 2014-10-01 04:58:47

回答

2

你是一個嚴重的PHP偏差,我不會推薦類似槍支下的東西,但這是一個有趣的問題。如果你這樣做,但首先得到回調(而不是直接調用它),一切都應該按預期工作。

$di->set('forum', function() { 
    \XenForo_Autoloader::getInstance()->setupAutoloader('../forums/library'); 
    \XenForo_Application::initialize('../forums/library', '../forums', true, array('resetOutputBuffering' => false)); 
    \XenForo_Session::startPublicSession(); 

    $model = \XenForo_Model::create('XenForo_Model_Thread'); 

    $callback = function ($id) use ($model) { 
     return $model->getThreadsInForum($id); 
    }; 

    return $callback; 
}); 

$callback = $this->forum; 
$forum = $callback(2); 

爲什麼?因爲__get魔法在你的Phalcon\DI\Injectable__call沒有實現,這是怎麼回事。你可以擴展InjectableController以下的小轉彎,這將有訣竅。

function __call($name, $arguments) 
{ 
    if (is_callable($callback = $this->$name)){ 
     return call_user_func_array($callback, $arguments); 
    } 

    // Or throw a bad method call exception… 

    return null; 
} 
+0

它的工作原理!但我最終改變了我的設計,我決定我不想直接在代碼中調用XenForo的方法,所以我註冊了一個將XenForo對象轉換爲我自己的。 – 2014-10-02 15:13:59

+0

酷。明智的舉動;) – 2014-10-02 15:14:48