【问题标题】:How to extend Yii framework classes and where to place the files如何扩展 Yii 框架类以及放置文件的位置
【发布时间】:2011-09-17 01:49:06
【问题描述】:

我想扩展一些内置的框架类,但是我有一些不清楚的地方:

  1. 我想我应该把我的类放在我的组件文件夹下,这是正确的地方吗?
  2. 我应该将类命名为Subfolder_ClassName,将文件命名为ClassName.php
  3. 如何继承?默认包含路径不包括框架本身。我假设有一种内置方法可以做到这一点,而无需我更改包含路径/开始使用自动加载功能或只需在我的代码中硬编码包含。

对吗?

【问题讨论】:

    标签: php yii project-layout


    【解决方案1】:

    源文件的放置

    将它们放在/protected/components 下是很自然的选择。如果您以后开发了更多可以跨项目重用的通用类,您可以考虑将它们放到一个单独的目录中。

    命名和目录结构

    这取决于您应用的规模。如果您没有很多组件(比如 20 个以下),那么恕我直言,您不需要任何目录结构,components 目录对所有组件都有好处。另一种实用的方法是将您的业务组件放入一个目录,将您的 HTML 组件放入另一个目录(例如widgets)。

    包括父类

    你的配置文件应该有这样的部分:

    // autoloading model and component classes
    'import'=>array(
        'application.models.activerecord.*',
        'application.models.forms.*',
        'application.components.*',
        'application.classes.*',
        // etc
    ),
    

    这部分实际上导致在您的应用程序实例上调用CModule::setImport 以注册可以自动加载的类。如果你想扩展这些类,那么你不需要做任何事情。

    如果您的某些组件依赖于未按上述方式导入的 Yii 类,您需要在声明类之前使用 Yiibase::import 显式导入它们。例如:

    Yii::import('zii.widgets.jui.CJuiSlider');
    
    class MySlider extends CJuiSlider {
        // class contents here
    }
    

    为路径注册别名

    如果您想为导入路径创建自己的别名(例如,有一个路径 myapp.components,您可以在导入类时引用),您可以使用 Yiibase::setPathOfAlias 执行此操作。一个很好的地方是配置文件的最顶部:

    <?php
    Yii::setPathOfAlias('myapp.components','components/my/');
    
    // This is the main Web application configuration. Any writable
    // CWebApplication properties can be configured here.
    return array(
        // your whole app configuration is here, and you can now do this:
       'import'=>array(
           // ...other imports...
           'myapp.components.*',
           // ...other imports...
       ),
    );
    

    【讨论】:

      【解决方案2】:

      如果你想在 yii-Framework 中创建一个类的子类,是的,你可以将你的类定义文件放在 project/protected/components 中。取决于您想要的最佳实践(即,您将创建数十个自定义类,而不是仅创建一两个扩展 FW 类),但将文件直接放在组件中在组织方面应该没问题。

      要继承,您可以按照以下方式创建文件:

      class MyNewClass extends CFrameworkClass
      {
          //All your stuff
      
      } 
      

      请注意,按照惯例,yii 框架类的前面有“C”(即 CController),我不会在此处添加“C”(CFramwork..),而不是为了遵守约定。

      【讨论】:

      • 所以,我在components下创建了一个子文件夹,试了一下,系统找不到父类(zii/widgets/CMenu)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      相关资源
      最近更新 更多