1

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

和:

/** @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");
    }
}
4

1 回答 1

0

像这样自动完成行为是不可能的,PhpStorm 总是会看到实际的方法签名,这需要第一个参数是 type Model

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

/**
 * @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");
    }
}

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

于 2015-10-31T15:20:51.853 回答