在Symfony2服务中回调失败
问题描述:
我在项目中使用PHP-FineDiff
作为服务。然而,当我尝试使用例如恢复差异来创建diff时,效果很好。 FineDiff::renderToTextFromOpcodes()
,没有任何反应。在Symfony2服务中回调失败
我在代码中挖了一点,发现回调不起作用。注释掉一些
if (!is_callable($callback)) {
return;
}
后,我遇到了错误:
Warning: call_user_func() expects parameter 1 to be a valid callback, class 'FineDiff' not found in /var/www/sopos-blog/src/Sopos/WikiBundle/Services/FineDiff.php line 321.
这些都是一些代码相关线路:
public static function renderToTextFromOpcodes($from, $opcodes) {
ob_start();
FineDiff::renderFromOpcodes($from, $opcodes, array('FineDiff','renderToTextFromOpcode'));
return ob_get_clean();
}
// ...
public static function renderFromOpcodes($from, $opcodes, $callback) {
if (!is_callable($callback)) {
return;
}
$opcodes_len = strlen($opcodes);
$from_offset = $opcodes_offset = 0;
while ($opcodes_offset < $opcodes_len) {
$opcode = substr($opcodes, $opcodes_offset, 1);
$opcodes_offset++;
$n = intval(substr($opcodes, $opcodes_offset));
if ($n) {
$opcodes_offset += strlen(strval($n));
}
else {
$n = 1;
}
if ($opcode === 'c') { // copy n characters from source
call_user_func($callback, 'c', $from, $from_offset, $n, '');
$from_offset += $n;
}
// ...
答
我猜你的类的FQCN为Sopos\WikiBundle\Services\FineDiff
,所以回调必须是这些:
$arrayCallback = array(__NAMESPACE__.'\FineDiff','renderToTextFromOpcode');
$stringCallback = __NAMESPACE__.'\FineDiff::renderToTextFromOpcode';
您也可以用真实名称空间替换__NAMESPACE__
。
答
Symfony2无法自动载入类FineDiff
。将名称空间添加到回调函数中:
public static function renderToTextFromOpcodes($from, $opcodes) {
ob_start();
FineDiff::renderFromOpcodes($from, $opcodes, array(__NAMESPACE__.'\FineDiff','renderToTextFromOpcode'));
return ob_get_clean();
}
谢谢@Florent,它现在可以工作! – Michael 2012-08-10 15:38:44