在 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 中为 JSON 返回正确的内容类型?
在 PhpStorm 中为 Laravel Homestead vagrant VM 运行测试