在 PHPStorm 中为 CakePHP 模型行为提供类型提示

Posted

技术标签:

【中文标题】在 PHPStorm 中为 CakePHP 模型行为提供类型提示【英文标题】:Type hinting in PHPStorm for CakePHP model behavior 【发布时间】:2016-01-29 16:17:49 【问题描述】:

我正在尝试在控制器内为具有行为的模型使用自动完成功能。

与:

/** @var ModelName **/
public $ModelName;

它只是自动完成 ModelName 中的任何内容,并且:

/** @var BehaviorNameBehavior **/
public $ModelName;

只是自动完成 BehaviorNameBehavior 中的任何内容,但我认为这有点明显。我查看了 phpdoc 文档,但没有看到任何方法可以为一个变量指定两个类。

还有一个问题是,在 CakePHP 中,行为函数的第一个参数始终是 (Model $model),但该参数是在 CakePHP 框架内部指定的,并且在调用控制器/模型中的函数时不包括在内。

有人能搞定这个吗?

编辑:添加示例

class ModelName extends AppModel 
    public $actsAs = array("BehaviorName");

    public function someModelFunction() 


class BehaviorNameBehavior extends ModelBehavior 
    public function someBehaviorFunction(Model $model, $param) 


class ControllerNameController extends AppController 
    /** @var BehaviorNameBehavior|ModelName $ModelName */

    public $uses = array("ModelName");

    public function someAction() 
        // Type hinting here thinks model should be first parameter but that's not how CakePHP works
        $this->ModelName->someBehaviorFunction("some param value");
    

【问题讨论】:

"而且我看不到任何方法可以为一个变量指定两个类。"/** @var BehaviorNameBehavior|ModelName **/ 啊,谢谢你,这解决了问题 #1,但它没有解决行为函数中的模型参数。 没有线索 - 我自己没有使用 CakePHP,所以如果没有一些代码示例就不能说什么。 加了一个例子给大家看看。 运气不好。我想到的一般想法都没有奏效。绝对需要有蛋糕经验的人(知道框架足够好)。 【参考方案1】:

不可能像这样自动完成行为,PhpStorm 将始终看到实际的方法签名,这要求第一个参数的类型为 Model

为模型对象提供适当代码完成的唯一方法是通过the @method tag一一定义“继承”方法,即

/**
 * @method returnType someBehaviorFunction(argumentType $param)
 */
class ModelName extends AppModel 
    public $actsAs = array("BehaviorName");

    public function someModelFunction() 


/**
 * @property ModelName $ModelName
 */
class ControllerNameController extends AppController 
    public $uses = array("ModelName");

    public function someAction() 
        $this->ModelName->someBehaviorFunction("some param value");
    

或者通过使用一个更干的虚拟接口,并且更容易通过使用 PhpStorms 重构功能从行为类中提取接口并稍微修改它来创建。

/**
 * @internal
 */
interface IBehaviorNameBehaviorStub 
    /**
     * @param argumentType $param
     * @return returnType
     */
    public function someBehaviorFunction($param);


/**
 * @property IBehaviorNameBehaviorStub|ModelName $ModelName
 */
class ControllerNameController extends AppController 
    public $uses = array("ModelName");

    public function someAction() 
        $this->ModelName->someBehaviorFunction("some param value");
    

注意似乎有一个错误,当只有一个标签时,PhpStorm 有时无法正确识别@property 标签!似乎是一个缓存问题,添加一个额外的@property 标记并稍后将其删除通常可以解决问题。

【讨论】:

以上是关于在 PHPStorm 中为 CakePHP 模型行为提供类型提示的主要内容,如果未能解决你的问题,请参考以下文章

cakephp:从下拉列表中为报告添加过滤器

在 CakePHP 3 中为文章添加评论

如何在 CakePHP 中为 JSON 返回正确的内容类型?

在 PhpStorm 中为 Laravel Homestead vagrant VM 运行测试

在 cakephp 2.x 中为类名关闭 CamelCase [关闭]

如何在 CakePHP 2 中为 3 个树状连接表保存数据