Yii框架:setPathOfAlias()返回null

时间:2014-05-24 22:08:36

标签: yii yii-components

我正在尝试将MaxMind's GeoIp2放入我的Yii应用程序中。基本上,我复制了protected -> vendors -> maxmind下“src”下的文件(参见上一个链接)。我的应用程序下的文件夹结构如下:

protected
|---- vendors
      |---- Zend
      |---- maxmind
           |---- Database
                 |---- Reader.php
           |---- Model
           |---- ...
      |---- ...

之后,我在index.php文件中创建了路径别名:

Yii::setPathOfAlias('Zend', Yii::getPathOfAlias('application.vendors.Zend'));
Yii::setPathOfAlias('GeoIp2',   Yii::getPathOfAlias('application.vendors.maxmind'));

该路径适用于'Zend'别名,但是通过返回null,它无法用于'GeoIp2'。

Yii::createApplication("FrontendApplication", $config)->run();
echo "Path 1: " . Yii::getPathOfAlias("Zend"). '<br />'; // Correct path!
echo "Path 2: " . Yii::getPathOfAlias("GeoIp2"). '<br />'; // <==== NULL
echo "Maxmind path: " . Yii::getPathOfAlias('application.vendors.maxmind'). '<br />'; // correct path

var_dump(is_dir(Yii::getPathOfAlias('application.vendors.maxmind'))); // true

为什么会发生这种情况的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:0)

getPathOfAlias()调用创建路径别名是在CApplication的构造函数中创建的。但是当包含main.php时,构造函数还没有被调用。

要配置路径别名,请使用main.php中的aliases属性。像这样:

return array(
    'aliases' => array(
        'GeoIp2' => 'application.vendors.maxmind',
    ),
    ...

答案 1 :(得分:0)

固定!解决方案:

我没有将setPathOfAlias()调用到index.php文件中,而是将别名添加到我的配置文件中(即protected - &gt; config - &gt; main.php),作为参数,如下所示:

$config = array(
    'import' => array(),
     'components' => array(),
     ...
     'aliases' => array(
          'Zend' => 'application.vendors.Zend',
          'Maxmind' => 'application.vendors.Maxmind',
        ),
      ...
      'params' => array()
    );

显然,index.php不是宣布这一点的正确位置。可能是因为自动加载器,我不是100%肯定,但由于Zend有自动加载器而MaxMind没有,这就是为什么它可能适用于Zend而不适用于MaxMind。这样做可以使事情奏效。您可能会注意到,出于一致性原因,我还将Zend别名路径移动到同一位置:)