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