4

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())
    {...

このメソッドの return パラメータは、CActiveRecord から Member、self、parent、$this、child などに渡されます。オートコンプリートは、「Member」の場合にのみ機能しました。ただし、この方法は Member モデルだけでなくすべてのモデルで使用されるため、これは解決策ではありません。

誰かが解決策を知っていれば(できればフレームワークのコアメソッドを変更せずに)、喜んでいます。

4

2 に答える 2

3

: 私のすばらしい Yii コードはすべて、bitbucketのここここのリポジトリで自由に入手できます。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...
    }
}

オートコンプリートはすべてのサブクラスで正常に機能します...

これを更新して皆さんにお知らせしようと思いました。

于 2012-07-21T16:55:12.157 に答える
0

phpdoc を使用できます@method。頻繁に使用されるモデルにこのアプローチを使用するか、コード ジェネレーター用の新しいテンプレートを作成できます。

    /**
     * @method Member findByPk($pk,$condition='',$params=array())
     */
    class Member extends CActiveRecord
    {
于 2012-08-16T05:58:05.230 に答える