在框架内创建模块系统

时间:2011-05-13 08:32:39

标签: php frameworks module

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

我的框架是一个自定义构建的框架,但与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
     }
}

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

2 个答案:

答案 0 :(得分:3)

祝你的mvc和cms好运。 我前段时间已经实现了相同的想法,我的方法很简单,第一个出现在我脑海中。

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

答案 1 :(得分:1)

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

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

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

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

我认为当您需要一个用于向客户提供网站的框架时,这种方法很有效。如果不同的人需要能够使用您的框架,这可能不会有效。