用于CakePHP模型行为的PHPStorm中的类型暗示
我尝试在控制器中为具有行为的模型使用自动完成 与: 它只是自动完成ModelName中的任何内容,并且:用于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框架中内部指定的,在控
/** @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");
}
}