PhpStorm中ZF2视图助手的自动完成

5
有没有人知道PHPStorm是否内置支持视图助手自动完成,或者有可能为其编写插件。我不想使用内联变量定义,因为如果我使用很多视图助手,则这样做会很麻烦。
$this->inlineScript()-> //I want some autocomplete here.

$this->translate('some translation')-> //Please give me autocompletion

如果我使用变量定义,它会变成像这样的东西,但它会真正地混乱我的视图:

/* @var $inlineScript \Zend\View\Helper\InlineScript */
$inlineScript = $this->inlineScript();
$inlineScript-> //Now I have autocompletion goodness

/* @var $translate \Zend\I18n\View\Helper\Translate */
$translate = $this->translate();
$translate('some translation')-> //Now I have autocompletion goodness

inlineScript() 和/或 translate() 是如何声明的?也许它们没有适当的 PHPDocs? - LazyOne
1
@LazyOne,它们是通过神奇的__call方法动态创建的 :) - Bram Gerritsen
2
类似于 https://github.com/zendframework/zf2/blob/release-2.1.3/library/Zend/Mvc/Controller/AbstractController.php#L31-L42 的东西可以应用于 PHPRenderer... 然后你会使用 /* @var $this \Zend\View\Renderer\PhpRenderer */ 进行类型提示。这可能有效。 - Ocramius
那么,通过在该类中使用 @method PHPDoc 注释声明它们如何呢?附注: 正确的 PHPDoc 语法是 /** @var [type] [varname] */ 而不是 /* @var [varname] [type] */(注意顺序和双星号)- 两种变体都可以在 PhpStorm 中工作,但“正确”的是第一种。 - LazyOne
@LazyOne,@method确实是正确的方法。ocramius提到的文件也是这样做的。感谢您对正确语法的反馈,我大多数情况下使用第一种变体。 - Bram Gerritsen
显示剩余5条评论
1个回答

12

注意:我将评论中讨论的方法发布为答案。

对于不存在的方法进行类型提示,语法如下:

/**
 * @method \Zend\Mvc\Controller\Plugin\Url url(string $route = null, array $params = null)
 */
class MyClass
{
}

这使我们能够在任何被识别为MyClass的变量上使用方法url的类型提示:
/* @var $a \MyClass */
$a->// typehint!

你需要一个名为“fake”的类,然后以以下方式启动你的视图脚本:
/* @var $this \MyFakeClass */

这样做可以在视图脚本中为$this提供类型提示。您可以打开一个合适的拉取请求,针对https://github.com/zendframework/zf2提交类似于https://github.com/zendframework/zf2/pull/3438的内容。


1
这对于用户定义的视图助手有什么帮助呢?您无法编辑AbstractController,因此用户定义的助手仍将是未知的。 - Quolonel Questions
1
@QuolonelQuestions 如果值得的话,你总是可以进行子类化。 - Ocramius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接