用于CakePHP模型行为的PHPStorm中的类型暗示

用于CakePHP模型行为的PHPStorm中的类型暗示,cakephp,phpstorm,phpdoc,type-hinting,cakephp-2.x,Cakephp,Phpstorm,Phpdoc,Type Hinting,Cakephp 2.x,我尝试在控制器中为具有行为的模型使用自动完成 与: 它只是自动完成ModelName中的任何内容,并且: /** @var BehaviorNameBehavior **/ public $ModelName; 自动完成BehaviorNameBehavior中的任何内容,但我认为这有点明显。我看过PHPdoc文档,没有找到任何方法可以为一个变量指定两个类 还有一个问题是,在CakePHP中,行为函数的第一个参数始终是(Model$Model),但该参数是在CakePHP框架中内部指定的,在控

我尝试在控制器中为具有行为的模型使用自动完成

与:

它只是自动完成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");
    }
}

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

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

或者使用一个虚拟接口,这个接口比较枯燥,并且更容易创建,方法是使用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");
    }
}

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

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

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

或者使用一个虚拟接口,这个接口比较枯燥,并且更容易创建,方法是使用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");
    }
}

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

“我看不到任何方法可以为一个变量指定两个类。”<代码>/**@var BehaviorNameBehavior | ModelName**/啊,谢谢你,这解决了问题#1,但它没有解决行为函数中的模型参数。没有线索-我自己没有使用CakePHP,所以没有一些代码示例就不能说任何东西。添加了一个示例供你查看。这里没有运气。我脑子里的所有想法都不管用。肯定需要有蛋糕经验的人(对框架有足够的了解)。“而且我看不到任何方法可以为一个变量指定两个类。”<代码>/**@var BehaviorNameBehavior | ModelName**/啊,谢谢你,这解决了问题#1,但它没有解决行为函数中的模型参数。没有线索-我自己没有使用CakePHP,所以没有一些代码示例就不能说任何东西。添加了一个示例供你查看。这里没有运气。我脑子里的所有想法都不管用。肯定需要有蛋糕经验的人(对框架有足够的了解)。
/**
 * @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");
    }
}