Symfony2服务中的回调失败

时间:2012-08-10 14:00:25

标签: php symfony callback

我在项目中使用PHP-FineDiff类作为服务。但是,当我尝试使用例如恢复差异时,创建差异很好。 FineDiff::renderToTextFromOpcodes(),没有任何反应。

我在代码中挖了一点,发现回调不起作用。在评论出一些

之后
if ( !is_callable($callback) ) {
    return;
}

我遇到了错误:

  

警告:call_user_func()要求参数1是有效的回调,在/var/www/sopos-blog/src/Sopos/WikiBundle/Services/FineDiff.php第321行中找不到类'FineDiff'。

这些是一些相关的代码行:

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;
            }

// ...

2 个答案:

答案 0 :(得分:1)

我猜你班级的FQCN是Sopos\WikiBundle\Services\FineDiff,所以回调必须是这样的:

$arrayCallback = array(__NAMESPACE__.'\FineDiff','renderToTextFromOpcode');
$stringCallback = __NAMESPACE__.'\FineDiff::renderToTextFromOpcode';

您也可以用真实命名空间替换__NAMESPACE__

答案 1 :(得分:0)

Symfony2无法自动加载课程FineDiff。将命名空间添加到回调:

public static function renderToTextFromOpcodes($from, $opcodes) {
  ob_start();
  FineDiff::renderFromOpcodes($from, $opcodes, array(__NAMESPACE__.'\FineDiff','renderToTextFromOpcode'));
  return ob_get_clean();
}