在setTranslator上出现致命控制台错误


ZF2 Fatal console error on setTranslator

我的cli控制器为翻译器抛出错误。

Fatal error: Call to undefined method Zend'Mvc'Router'Console'SimpleRouteStack::setTranslator() in ..

出错的函数

设置路由转换器

public function onPreRoute($e)
{
    $application    = $e->getTarget();
    $serviceManager = $application->getServiceManager();
    $serviceManager->get('router')->setTranslator($serviceManager->get('translator'));
}

通过这个git问题跟踪器,我注意到有一个问题,因为它不兼容。我的问题是,我怎么能防止cli模块试图设置翻译器,因为它现在给我一个致命的错误。

Git url: https://github.com/doctrine/DoctrineORMModule/issues/333

谢谢

我曾经遇到过这个问题,因为CLI请求路由与标准请求对象不同(显然)

所以Zend'Http'Request不等于Zend'Console'Request

它们不是同一个模块,而且它们的结构也不一样,如果它们实现了相同的接口,那么有些方法就不存在了。

Zend'Http'Request extends AbstractMessage(这个扩展消息)直接Zend'Console'Request extends Message

你的问题就是一个很好的例子,我们也可以谈谈$request->getUri()也不能工作。

为了防止这种情况,我有一个解决方案,虽然没有我想的那么优雅,但它有效。如果有人有更优雅的解决方案,欢迎分享。

所以解是:

if (php_sapi_name() !== 'cli' && $request->getServer('HTTP_X_FORWARDED_FOR', false)) {
// Your code that not compliant with console routes
}

你也可以使用这个条件语句:

 if (!($request instanceof 'Zend'Console'Request) and !$request->isXmlHttpRequest()) {
// Your code that not compliant with console routes or ajax calls
}
为了找到这个解决方案,我受到了Zend骨架应用程序的启发。在index.php中,他们这样做了:
if (php_sapi_name() === 'cli-server') {
    $path = realpath(__DIR__ . parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH));
    if (__FILE__ !== $path && is_file($path)) {
        return false;
    }
    unset($path);
}

我只是看到他们做了一些改变自从我第一次下载它;)