Php 在框架内创建模块系统

Php 在框架内创建模块系统,php,frameworks,module,Php,Frameworks,Module,我正在寻找在我的应用程序框架中实现模块系统的方法,模块将是以某种方式改变设计的类文件,以便自动与用户干预集成 我的框架是一个定制的框架,但与codeigniter非常相似,只是稍微轻一点 我的想法是在模板文件中调用模块位置,并自动加载和解析模块 <html> <head> <title>Welcome to my site</title> </head> <body>

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

我的框架是一个定制的框架,但与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>
因此,对我来说,这似乎可以很好地工作,但问题是,我以前从未构建过模块系统,我觉得它们更像是挂钩

在我看来,我基本上想要一个由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
     }
}

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

祝您mvc和cms好运。 不久前,我也实现了同样的想法,我的方法很简单,第一次出现在我脑海中

  • 将系统基于页面和模块(小部件)
  • 页面信息保存在数据库表中,如“页面”
  • 模块(widgets)是一个包含元数据(定义)和业务逻辑的类
  • 若将模块添加到页面,其特定信息将保存在数据库中
  • 下一次,如果您希望拥有它的实例,只需将相关参数传递给它的类,您就拥有了它
  • 因此,您可以在不同的位置和不同的实例中使用模块的单个定义
  • 您可以在数据库中添加任意多的页面
  • 用户可以在单个页面中添加任意多个小部件

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

    其中一个设置指定需要加载模块的页面。如果每个页面上都需要该模块,则该模块为(*)。My framework base controller检查模块列表,然后检查模块的页面设置,以查看是否应加载该模块

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

    虽然我不这么认为,但我认为大多数人使用smarty标签进行替换


    我认为当你需要一个你个人用来向客户交付站点的框架时,这种方法很好用。如果不同的人需要能够使用您的框架,那么这可能不起作用。

    谢谢您的回复,我会看看以后能想出什么,尽管数据库存储不是我想要的路径。@RobertPitt,它可能适用于在类和模块之间有一对一对应关系的场景,但数据库的事情对我来说是可行的。
    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
         }
    }