试图获得非物体上的财产Yii 1.1.15

时间:2015-04-27 18:50:27

标签: php yii warnings

我尝试在我的config/main.php

中更改CGridView小部件的Css文件
'components' => array(
     'widgetFactory' => array(
         'widgets' => array(
            'CGridView' => array(
                'cssFile' => Yii::app()->request->baseUrl . '/css/gridview.css',
            ),
         ),
      ),
  ...

我收到警告:

Trying to get property on a non object /path_to_project/protected/config/main.php on line 79

我如何能够抑制这个警告,以及为什么我得到它,当我在视图文件中使用它时,它都能正常工作。

P.S。是的我可以将display_errors ini设置为false并且消息将消失,但我希望清楚地了解它。谢谢!

1 个答案:

答案 0 :(得分:4)

警告的原因是CHttpRequest对象Yii::app()->request尚未实例化。

来自the API page for CApplication

  

处理a时,CApplication将经历以下生命周期   用户请求:

     
      
  1. 加载应用程序配置;
  2.   
  3. 设置错误处理;
  4.   
  5. 加载静态应用程序组件;
  6.   
  7. onBeginRequest:预处理用户请求;
  8.   
  9. processRequest:处理用户请求;
  10.   
  11. onEndRequest:后处理用户请求;
  12.         

    从生命周期3开始,如果发生PHP错误或未捕获的异常,应用程序将切换到其错误处理逻辑,然后跳转到步骤6。

您的错误发生在第一步。因此,Yii的错误处理尚未设置。唯一的选择是使用@ operator

来取消此警告
 'cssFile' => @Yii::app()->request->baseUrl . '/css/gridview.css',

<强>无论其

这是一个糟糕的主意,因为你基本上是隐藏错误而不是修复错误。

如果您的观点显示正确(没有css错误),您可以省略Yii::app()->request->baseUrl并使用:

'cssFile' => '/css/gridview.css'

如果您遇到错误,可以在components文件夹中创建一个扩展CWidgetFactory的类,并设置任何依赖于其他组件的变量,例如

class MyWidgetFactory extends CWidgetFactory {
    public function init() {
        parent::init();
        $this->widgets['CGridView']['cssFile'] = Yii::app()->request->baseUrl.'css/gridview.css';
    }
}

您需要调整components才能使用此文件:

'components' => array(
    'widgetFactory' => array(
        'class' => 'MyWidgetFactory'
    ...