【问题标题】:Type hinting in PHPStorm for CakePHP model behavior在 PHPStorm 中为 CakePHP 模型行为提供类型提示
【发布时间】: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,所以如果没有一些代码示例就不能说什么。
  • 加了一个例子给大家看看。
  • 运气不好。我想到的一般想法都没有奏效。绝对需要有蛋糕经验的人(知道框架足够好)。

标签: cakephp phpstorm phpdoc type-hinting cakephp-2.x


【解决方案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 标记并稍后将其删除通常可以解决问题。

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2019-03-08
    • 2021-12-01
    • 2013-07-14
    • 2020-09-02
    • 2015-03-30
    • 2015-05-23
    • 2018-08-15
    • 2015-10-14
    相关资源
    最近更新 更多