對(duì) events.php 設(shè)置 namespace YourApp;
$worker->eventHandler = 'YourApp\Events';
啟動(dòng)的時(shí)候,就會(huì)報(bào)錯(cuò) Waring: Events::onMessage is not callable
這是按照文檔來(lái)的,為什么還是報(bào)錯(cuò)呢,這是什么原因
我也遇到了這個(gè)問(wèn)題,經(jīng)過(guò)自己摸索,已經(jīng) 解決。
看了BusinessWorker類(lèi)中,是通過(guò)is_callable函數(shù)來(lái)判斷是否是函數(shù)的。
源碼如下:
if (is_callable($this->eventHandler . '::onMessage')) {
$this->_eventOnMessage = $this->eventHandler . '::onMessage';
} else {
echo "Waring: {$this->eventHandler}::onMessage is not callable\n";
}
_這時(shí)我們心中的問(wèn)題就是:那為何我們帶入命名空間后還是無(wú)法通過(guò)is_callable的檢測(cè)呢?_
答案:我們的命名空間沒(méi)有注冊(cè),無(wú)法被BusinessWorker發(fā)現(xiàn)。
解決方法:在composer.json中注冊(cè),代碼如下(Application就是我的命名空間,您自己的可以根據(jù)實(shí)際情況修改Applications(命名空間)文件夾要composer.json同級(jí)):"
autoload": {
"psr-4": {
"Applications\\": "Applications/"
}
}
?
嘗試了很多方式都沒(méi)解決,我妥協(xié)了,用原生引入文件,
include_once __DIR__ .'/../../../../application/push/controller/Events.php';
$directory=new Events();
if (method_exists($directory,'onMessage')) {
$this->_eventOnMessage = $this->eventHandler . '::onMessage';
} else {
echo "Waring: {$this->eventHandler}::onMessage is not callable\n";
}
必須執(zhí)行
composer dump-autoload
修改的 composer.json 文件配置自動(dòng)加載才生效