1

解决方案:

应用程序的 Document Root 中有一个 Samples.php 文件。这在应用程序的正常 Yii 执行链中是如何实际运行的,我无法理解。但确实如此,我删除了它,现在一切正常。谢谢!


更新:这几乎可以肯定是一个应用程序级别的缓存问题,除了所有缓存(我知道的)都被禁用。我可以进入生产模型文件夹并删除各种模型,然后 Yii 立即抛出这些模型不存在的预期错误。Samples 模型并非如此。它留在身边。


Yii Search 有一个非常奇怪的问题。

我正在做的是搜索相关模型,就像我之前做过 100 次一样。这在我的开发主机上运行良好,但一旦我将其发布到生产主机,它就会失败:属性“Samples.cancer_search”未定义。

我已经两次和三次检查文件是否实际正在发布。该属性列在 Samples 模型的规则中的“搜索时安全”列表中。该属性在模型中被声明为公共变量。在开发中完美运行,但是当我将这些文件(甚至整个应用程序)发布到生产环境时,它仍然没有定义属性。

比这更奇怪的是,我进入 prod 服务器并复制了错误的模型、控制器和视图以使用新名称(使用相同的 db 表)并且它工作正常。我所做的只是将模型、控制器和视图的名称从 Samples 更改为 SamplesTest/SamplesTestController,它就可以工作了!

我已禁用所有缓存(正在使用 memcache)并重新启动服务器。仍然给出同样的错误。

该模型(适用于开发,而不是产品。为清楚起见缩短了)

 class Samples extends CActiveRecord
 {

// .... // 

// for search/sort on related data
public $cancer_search;
public $cancer_search_test;

// .... // 

public function rules()
{
    return array(
        array('id, patient_id, cancer, cancer_id, cancer_search, cancer_search_test, requested_date, ...', 'safe', 'on'=>'search'),
    );
}

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'cancer' => array(self::BELONGS_TO, 'Cancers', 'cancer_id'),
        'cancerTest' => array(self::BELONGS_TO, 'Cancers', 'cancer_id'),
        )
}

public function attributeLabels()
{
    return array(
        'cancer_id' => 'Cancer Classification',
        'cancer' => 'Cancer Classification',
        'cancer_search' => 'Cancer Classification',
        'cancer_search_test' => 'Cancer Classification',
    );
}

public function search()
{  
    $criteria=new CDbCriteria;        
    $criteria->group = 't.id';  
    $criteria->together = true;

    $criteria->with[] = 'cancer';
    if($this->cancer_search) {
      $criteria->addSearchCondition("cancer.name",$this->cancer_search);
    }

    $criteria->compare('id',$this->id,true);
    $criteria->compare('patient_id',$this->patient_id,true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
        'sort'=>array(
            'attributes'=>array(                   
                 'cancer_search'=>array(
                    'asc'=>'cancer.name',
                    'desc'=>'cancer.name DESC',
                ),
                '*',
            ),
        ),

    ));

}

和搜索视图

 // on production, this doesn't throw an error, but the search doesn't work
 $columns[]= array(
        'name'  => 'cancer',
        'value'=>'$data->cancer->name', 
        'type'  => 'raw',
        'htmlOptions'=>array('style'=>'width:100px;'),
    );

 // gives property not defined error on prod, even though it is defined, and works fine on dev
 $columns[]= array(
        'name'  => 'cancer_search',
        'value'=>'$data->cancer->name', 
        'type'  => 'raw',
        'htmlOptions'=>array('style'=>'width:100px;'),
    );

  // both of these work fine on dev.

我已经清除了 Yii 资产文件夹,但无济于事。

我要疯了还是他们可能有一些我不知道的缓存?

谢谢。

--

另一个线索——我在搜索网格中注意到,在 prod 服务器上,它也没有在列标题中使用正确的属性标签。不知道为什么在 dev 和 prod 上是一样的。


编辑 2 我尝试简单地在模型中声明一个公共 var 并将其跟踪到控制器搜索方法中的日志,同样的处理。var 存在于 dev 上,但不存在于 prod 上。

编辑 3 现在我知道有些东西正在被缓存。我刚刚删除了 Samples 模型,它继续使用未找到我的新属性的旧缓存版本。Memcached 被禁用,我重置了 mysql 查询缓存。仍然使用这个幻像模型。

4

1 回答 1

1

原来在应用程序的 Document Root 中有一个旧的 Samples.php 模型文件。我一定是不小心上传到那里的。

令人惊讶的是,这实际上并没有导致 Yii 应用程序失败,而是覆盖了 Models/ 中存在(或不存在)的 Samples.php 模型

我预计该应用程序只会在受保护的情况下加载其组件,但显然不是。

谢谢。

于 2013-05-03T15:53:57.417 回答