【问题标题】:Which comes first, the framework or the application? Dynamic framework and application folders首先是框架还是应用程序?动态框架和应用程序文件夹
【发布时间】:2010-07-18 19:20:06
【问题描述】:

好的,所以我正在用 PHP 创建一个 MVC 框架,我希望它非常灵活。这一切都很好 - 我目前正在研究这个并且一切进展顺利(所以我不想使用 Zend 或其他预先存在的框架,哈哈!),但我想同时制作框架和应用程序很有活力。我会尽力解释:

这是一个简化的目录结构:

- index.php           (wants to use app1 or app2 depending on domain name)
- /app1               (wants to use framework 1.1)
    - /config
        - config.php  
- /app2               (wants to use framework 1.2)
    - /config
        - config.php  
- /framework_1.1
- /framework_1.2

引导文件 /index.php 接收所有传入请求。然后它将根据特定条件从 /app1/config/config.php/app2/config/config.php 等加载某个应用程序的配置文件,说.. HTTP 主机:

// /index.php
switch ( $_SERVER[ 'HTTP_HOST' ] ) {
    case 'localhost':
        $app_root = ROOT . 'app1/';
        break;
    case 'site.com':
        $app_root = ROOT . 'app2/';
        break;
    default:
        $app_root = ROOT . 'application/';
        break;
}
define('APP_ROOT', $app_root);

引导文件然后加载应用程序的配置文件:

// /index.php
include( APP_ROOT . 'config/config.php' );

将从应用程序的配置文件中返回一个 $config 数组,该数组将指示框架文件的位置。

// /app2/config/config.php
$config['framework_root'] = '/framework_1.2/';

Bootstrap 运行该框架。

// /index.php
include( $config['framework_root'] . 'config/bootstrap.php' );

这是最好的解决方法吗?

唯一的问题是 /index.php 文件必须知道所有可能的应用程序,因此用户需要编辑 /index.php 中的 switch 语句 (或者 /index.php 包含的 /apps.php 文件,也许?)。

此外,必须在加载框架文件之前加载应用程序的配置文件,这对我来说似乎有点奇怪......

有没有一种简单的方法可以让请求指定应用程序,应用程序指定要使用的框架,还是上述方法最简单?

对不起,如果这令人困惑!写得让我有点困惑;)

【问题讨论】:

    标签: php model-view-controller web-applications frameworks


    【解决方案1】:

    我大部分时间都使用Symfony,所以我会在回答你的问题时应用我的知识:

    有没有一种简单的方法可以让请求指定应用程序

    使用多个“index.php”(或使用?app=xxx)和URL-rewrite 组合。这让事情变得更干净了。

    另外,应用程序的配置文件必须在加载框架文件之前加载,这对我来说似乎有点奇怪......

    这并不奇怪,您当然需要在引导框架之前配置和启动一些状态,但也许您可能希望提供框架引导类的子类,以定义框架引导期间应执行的操作。

    我建议您查看 Symfony2 以了解它们如何模块化/管理库和依赖项。说真的,没有理由编写另一个框架,而是为现有框架做出贡献 - 除非您发现它们与您的愿景不同。

    【讨论】:

    • 我看过 Symphony,但我认为我对命名空间的了解还不够,无法有效地遵循代码2。不过我会继续研究它。多个“index.php”文件的问题在于,大量代码将被一遍又一遍地复制,并且任何小的更改都需要在每个文件中复制。对不起,我不太明白你的意思是我的引导类的子类化来定义引导期间应该做什么。你能详细说明一下吗?感谢您的建议!而且我认为我还不够聪明,无法做出贡献;)
    • 看看Symfony的ProjectConfiguration。每个新项目都会有一个扩展它的引导文件。使用助手和面向对象的继承可以消除代码重复:)
    • 好的,但是假设我的 AppConfiguration 类必须扩展 Configuration。如果我在运行我的框架之前调用我的应用程序配置文件,AppConfiguration 将如何知道 Configuration 是什么?配置不是框架的 /classes/ 目录中的一个类吗?这意味着它会根据应用程序想要运行的框架而改变......?
    • 跳出框框思考。您的 ApplicationConfiguration/ProjectConfiguration/*Configuration 可以是独立的库,也可以是框架的一小部分,它们将在“启动框架”之前首先加载(顺便说一句,您正在编写 PHP 应用程序,而不是 Java)。抛开这个想法,它会阻碍你的创造力。
    • 哈哈好吧 =P 我想我想出了自己的解决方案,所以我认为现在可以了。 “您正在编写 PHP 应用程序,而不是 Java”是什么意思?我知道它们在很多方面都不同,但我的评论中究竟指的是什么?
    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多