【问题标题】:PhpStorm cannot autocomplete model attributesPhpStorm 无法自动完成模型属性
【发布时间】:2012-05-26 17:15:46
【问题描述】:

当我使用 find()、findAll()、findByAttributes() 等时,我希望 PhpStorm 自动完成我的模型属性...

我有一个这样的模型:

/**
 * member model parameters:
 * @property integer $id
 * @property integer $city_id
 * @property string $e_mail
 */

    class Member extends CActiveRecord
    {
        /**
         * @static
         * @param string $className
         * @return Member
         */
        public static function model($className = __CLASS__)
        {
            return parent::model($className);
        }
...

当我使用主动记录方法时:

$member = Member::model()->findByAttributes(array('e_mail'=>'Foo Bar'));

并在我写这篇文章时尝试自动完成:

$member->

它只给了我列表中CActiveRecord的参数和方法。

我试图改变

    /**
     * Finds a single active record that has the specified attribute values.
     * See {@link find()} for detailed explanation about $condition and $params.
     * @param array $attributes list of attribute values (indexed by attribute names) that the active records should match.
     * An attribute value can be an array which will be used to generate an IN condition.
     * @param mixed $condition query condition or criteria.
     * @param array $params parameters to be bound to an SQL statement.
     * @return CActiveRecord the record found. Null if none is found.
     */
    public function findByAttributes($attributes,$condition='',$params=array())
    {...

此方法从 CActiveRecord 到 Member、self、parent、$this、child 等的返回参数... 自动完成仅在“会员”时有效。但是这种方法适用于所有模型,而不仅仅是 Member 模型,所以这不是解决方案。

如果有人知道解决方案(最好不更改框架核心方法),我会很高兴。

【问题讨论】:

  • 根据我的经验,您(很遗憾)目前无法做到这一点。有@return self 之类的注解,但它们不适用于继承。我已经开始明确注释所有变量,例如/** @var Member $member */
  • 感谢您的回复,@DCoder。我也在使用显式注释。但是通过代码和降低可读性等看起来很难看......如果我找到一个解决方案自动执行那将非常好。

标签: phpstorm yii


【解决方案1】:

注意:我所有很棒的 Yii 代码都可以在 bitbucket 的存储库 herehere 上免费获得。如果你讨厌 Yii 的冗长,请查看我的 Pii 课程。我想你会完全理解它的。

我遇到了这个问题,我所做的是为静态 model() 方法增加 phpdoc。这解决了问题并且自动完成工作正常。

例如:

class MyModel extends CActiveRecord {

         /**
         * @static
         * @param string $className
         * @return MyModel|CActiveRecord
         */    
         public static function model($className=__CLASS__) {
             .... yada yada yada ...
         }

}

注意添加到“@return”的管道和附加类。这告诉 PhpStorm 在自动完成查找中也包含该类。

还有一点需要注意,如果您使用命名空间,您可能需要在某些类名前加上斜杠。仅取决于您的项目并包含在内。

=============== 更新:2013-08-05 ===============

使用 PhpStorm v6 及更高版本,您似乎可以使用:

   *
   * @return $this
   *

并且还可以获得正确的自动完成功能。

顺便说一句,整个静态“model()”方法已经过时了(就像 Yii 一样),我有一个基本模型类,我现在将它用于所有项目。它包含静态模型方法;然后在我的每个子类中不再需要它。这是一个例子......

<?php
namespace My\Awesome\Name\Space;

/**
 * MyBaseModel
 * etc.etc.
 */
class MyBaseModel extends \CActiveRecord
{
    /**
     * Returns the static model of the specified AR class.
     *
     * @param string $className
     *
     * @return $this
     */
    public static function model( $className = null )
    {
        return parent::model( $className ? : \get_called_class() );
    }

    //code code code code
}

/**
 * MySubModel
 */
class MySubModel extends MyBaseModel
{
    /**
     * {@InheritDoc}
     */
    public function tableName()
    {
        return 'my_sub_table';
    }
}

$_models = MySubModel::model()->findAll( 'xyz = :xyz', array( ':xyz' => 'abc' ) );

if ( !empty( $_models ) )
{
    foreach ( $_models as $_model )
    {
        //  Do awesome stuff...
    }
}

自动完成功能适用于所有子类...

只是想我会更新这个并让你们知道。

【讨论】:

    【解决方案2】:

    您可以使用 phpdoc @method。您可以将此方法用于常用模型,也可以为代码生成器创建新模板。

        /**
         * @method Member findByPk($pk,$condition='',$params=array())
         */
        class Member extends CActiveRecord
        {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 2019-04-01
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多