【问题标题】:How to load Yii modules component?如何加载 Yii 模块组件?
【发布时间】:2023-03-21 12:51:01
【问题描述】:

当我执行here 中描述的步骤时,我只是在 config/main.php 中使用配置:

<?php
return array(
  'modules' => array(
    'tracking' => array(
      'components' => array(
        'tracking' => array(
          'foo' => 'bar'
)))));

这个结果,当我 var_dump Yii::app()-&gt;getModule('tracking'):

object(TrackingModule)#148 (20) {
  ["defaultController"]=>  string(7) "default"
  ["layout"]=>  NULL
  ["controllerNamespace"]=>  NULL
  ["controllerMap"]=>  array(0) {}
  ["_controllerPath":"CWebModule":private]=>  NULL
  ["_viewPath":"CWebModule":private]=>  NULL
  ["_layoutPath":"CWebModule":private]=>  NULL
  ["preload"]=>  array(0) {}
  ["behaviors"]=>  array(0) {}
  ["_id":"CModule":private]=>  string(8) "tracking"
  ["_parentModule":"CModule":private]=>  NULL
  ["_basePath":"CModule":private]=>  string(79) "..."
  ["_modulePath":"CModule":private]=>  NULL
  ["_params":"CModule":private]=>  NULL
  ["_modules":"CModule":private]=>  array(0) {}
  ["_moduleConfig":"CModule":private]=>  array(0) {}
  ["_components":"CModule":private]=>  array(0) {}
  ["_componentConfig":"CModule":private]=>  array(1) {
    ["tracking"]=> array(1) {
      ["foo"]=> string(4) "bar"
    }
  }
  ["_e":"CComponent":private]=>  NULL
  ["_m":"CComponent":private]=>  NULL
}

我希望我可以通过Yii::app()-&gt;getModule('tracking')-&gt;tracking 访问模块组件。但正如您所见,Yii::app()-&gt;getModule('tracking') 没有组件,只有它的配置。

任何建议我做错了什么?

【问题讨论】:

    标签: php yii yii-components yii-modules


    【解决方案1】:

    您必须为组件指定类,例如在 config (TrackingClassName) 中:

    'modules' => array(
        'tracking' => array(
            'foo' => 'bar',
            'components' => array(
                'tracking'  => array(
                   'class' => 'TrackingClassName', 
                ),...
    

    【讨论】:

    • 这对我有用。但是为什么我必须声明组件类名呢?因为当我通过 GII 生成模块时,模块的 init 函数中有一行:$this-&gt;setImport(array( 'tracking.models.*', 'tracking.components.*', ));.
    • setImport 类似于 PHP include_once 但所有文件,例如。在跟踪/组件/*.php 中。当你第一次使用它时,在配置中设置类名意味着“新类”。你必须两者都做。这是合乎逻辑的,因为 Yii 如何知道组件中的哪个类?类名可以在模块内设置,但 IMO 只有在类名动态变化时才会更好。
    【解决方案2】:

    您仍然可以通过Yii::app()-&gt;getModule('tracking')-&gt;tracking 访问它。组件将在第一次使用之前创建。

    【讨论】:

    • 当我这样做 (Yii::app()-&gt;getModule('tracking')-&gt;tracking) 调用时,我得到的只是 php call on a non-object 错误。
    【解决方案3】:
    猜你喜欢
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2014-08-02
    • 2012-04-11
    • 1970-01-01
    • 2019-07-13
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多