在框架中创建模块系统

Creating a module system within a framework

提问人:RobertPitt 提问时间:5/13/2011 最后编辑:RobertPitt 更新时间:7/24/2011 访问量:1802

问:

我正在寻找在我的应用程序框架中实现模块系统的方法,模块将是以某种方式改变设计的类文件,以便自动与用户干预集成。

我的框架是一个自定义框架,但与 codeigniter 非常相似,只是更轻一点。

我的想法是在模板文件中调用模块位置,并自动加载和解析模块

<html>
     <head>
         <title>Welcome to my site</title>
     </head>
     <body>

          <header> 
               ....
               <?php $this->call_modules('header') ?>;
          </header>

          <section>

               <aside>
                    <?php $this->call_modules('sidebar') ?>;
               </aside>

          </section>

     </body>
</html>

这样,以下模块将被调用,内容将放在那里:

/system/applications/admin/modules/header/a.php
/system/applications/admin/modules/header/b.php
/system/applications/admin/modules/sidebar/a.php
/system/applications/admin/modules/sidebar/b.php

所以对我来说,这似乎可以正常工作,但问题是我以前从未构建过模块系统,我觉得这些更像是钩子。

在我的脑海中,我基本上想要一个由 1 个类文件和模板组成的简单系统,如果需要,calss 文件可能如下所示:

class Module_HelloWorld extends Module
{
     public static function info()
     {
         return array(
             'name' => 'Hello Word',
             'version' => '1.0.0',
             'description' => 'Dispalys "hello World"',
             'author' => 'Robert Pitt',
         );
     }

     public function execute($context,$action)
     {
          //$context would be the current view at the point of execution for the view

          //$action would be header / sidebar
     }
}

因此,简而言之,我的问题是什么,为我的框架设计模块系统的最佳方法是什么,允许将第三方模块放在目录中,然后从管理员安装,而无需太多用户干预?

PHP 框架 模块

评论


答:

3赞 Imran Naqvi 5/13/2011 #1

祝您的 MVC 和 CMS 好运。 我前段时间也实施了同样的想法,我的方法很简单,我想到了第一个。

  1. 将您的系统建立在页面和模块(小部件)的基础上。
  2. 页面信息保存在数据库表中,例如“页面”。
  3. 模块(小部件)是一个包含元数据(定义)和业务逻辑的类。
  4. 如果将模块添加到页面,则其特定信息将保存在数据库中。
  5. 下次如果您希望拥有它的实例,只需将相关参数传递给它的类,您就拥有了它。
  6. 这样,您就可以在不同位置和不同实例中使用模块的单一定义。
  7. 您可以在数据库中添加任意数量的页面。
  8. 用户可以在单个页面中添加任意数量的小部件。

评论

0赞 RobertPitt 5/13/2011
感谢您的回复,我稍后会看看我能想出什么,尽管数据库存储不是我想走的路。
0赞 Imran Naqvi 5/14/2011
@RobertPitt,它可能适用于您的场景,在类和模块之间具有一对一的对应关系,但数据库的东西对我有用。
1赞 Nadeem Hosenbokus 7/24/2011 #2

我不确定这是否有帮助,但对我来说,我想要一个框架,我可以在需要时扩展模块方面的功能,但在存储有关模块的信息方面使用最少的数据库交互。所以我有一个设置,我在文件夹中有模块,其中包含用于设置、css、js 和实际类的文件,这些文件必须遵循非常具体的命名约定。添加模组时,我需要添加文件夹,然后更新框架基本设置中的模块列表。

其中一个设置指定需要为哪个页面加载模块。如果每个页面上都需要该模块,则该模块为 (*)。我的框架基本控制器检查模块列表,然后检查模块的页面设置,看看是否应该加载它。

我的框架通过将模板加载到输出缓冲区中并存储在公共变量中来显示页面,然后整个框架中的任何代码都可以访问该变量。因此,我可以简单地使用 str_replace 来识别需要加载的部分(例如,模板中有一个指定页面主要内容的接口标签),然后替换为模块内容。因此,图库模块会将接口标签替换为图库页面上的图库,而文章模块将在文章页面上的接口标签上生成文章。

虽然我没有,但我认为大多数人都使用智能标签进行替换。

我认为当您需要一个您个人用来向客户交付网站的框架时,这很有效。如果不同的人需要能够使用你的框架,这可能就行不通了。