关于模型视图控制器:PHP MVC 框架的文件夹结构……我这样做对吗?

Folder structure of a PHP MVC framework... am I doing this right?

我目前正在开发自己的 PHP 框架,我需要一些帮助来确定我是否朝着正确的方向前进...

这个框架既是供我自己使用的,也是为了进一步提高我的 PHP 技能。我遇到了很多问题,通过克服它们我学到了很多东西,并且喜欢能够从无到有地创造一些东西,所以我宁愿不要看到像"Just use Zend"这样的答案! ;)

我已经阅读了 Stack Overflow 和其他一些网站上的大量文章,但无法完全得到我需要的正确答案,所以希望有人能给我一些有用的建议!

我尝试了几种不同的解决方案,但我最终让自己感到困惑,我不确定现在该往哪个方向发展!无法完全理解这一切......

'理论'框架结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- .htaccess
- index.php
- private/
    - app/
        - bootstrap.php
        - modules/
            - default/
                - controllers/
                    - pages.php
                    - index.php
                - models/
                - views/
            - admin/
                - controllers/
                - models/
                - views/
    - config/
        - config.php
        - autoloader.php
    - lib/
        - Some_Library
            - Class1
                - class1.php
            - Class2
                - class2.php
- public/
    - css
    - images
    - scripts

详情

  • index.php 是主文件,每个请求都使用 .htaccess 路由到该文件。
  • private/ 显然不能公开访问。
  • public/ 包含所有公共文件。
  • app/ 包含所有应用程序特定的代码。
  • lib/ 可以包含 Zend 或其他库(我也在自己工作),用自动加载器调用
  • bootstrap.php 是特定于应用程序的代码...我需要这个吗?主要的'index.php'足够了吗?
  • modules/ 将包含每个模块...我需要模块吗?
  • default/ 是包含大多数请求的 MVC 的默认模块(当 'admin' 不是 URL 的第一部分时使用)。
  • admin/ 是包含管理部分的 MVC 的模块。

无论如何,我的问题...

我认为将管理部分与网站的其他部分分开会更好,但这就是我卡住的地方。我已经制作了上面的结构来使用它,但我不确定这是否是最有效的方法。

如果请求 site.com/videos/view/1/ 来到我的网站..

模块:默认
控制器:视频
行动:查看
参数:数组('1')

如果请求 site.com/admin/pages/view/1/ 来到我的网站..

模块:管理员
控制器:页面
行动:查看
参数:数组('1')

这是解决这个问题的正确方法吗?还是我过于复杂化并做了一些不值得做的事情?

我是否应该为我的管理部分提供一个完全独立的应用程序框架...?我什至需要将管理部分的 MVC 与其余部分分开吗?

很抱歉问了这么多问题,只是想为您提供尽可能多的信息!随意回答你能回答的部分=P


我知道很久以前有人问过这个问题,但几天前我的情况完全相同。

提问者提出的解决方案基本上是我所采用的,奇怪的是。基本上,我从 ASP.NET MVC2 中借用了一个名为"区域"的概念。区域是网站的部分,有自己的控制器和视图(也是模型,但我不知道为什么......模型通常应该是通用的)。所以这和你最初的想法非常相似。

无论如何,遵循他们的文件夹路由结构对我的应用程序(管理类型区域、用户区域以及介于两者之间的另一个级别)非常有意义。看看它,你可能会在那里找到一些成功。

我的路由只考虑了区域。路线是硬编码的,所以如果我需要另一个区域,我只需调整我的路线文件。哦,如果指定了 $area,我的自动加载器会设置为查看区域文件夹。

/admin/team/add/ 读作,区域:管理员,控制器:团队,操作:add

/team/add/ 将读取为,区域:[none],控制器:团队,操作:add

文件夹结构有点像这样:

1
2
3
4
5
6
7
8
9
10
11
app/
   areas/
      admin/
          controllers/
          views/
      staff/
          controllers/
          views/
   controllers/
   models/
   views/


管理路由的一个解决方案是 CakePHP 所做的,
您首先为管理字符串定义一个配置
然后在您的控制器中使用具有特定命名转换的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Configuration ============================
Configure::write("admin_routing" , true );
Configure::write("admin_prefix"  ,"admin" );

//Controller ===============================
class MyController extends AppController{

    function index(){
      //Will map to /mycontroller/
    }


    function admin_index(){
      //Will map to /admin/mycontroller/
    }

}

您可以通过使用路由系统来概括这一点
看看你最喜欢的框架是怎么做的

另说

  • 模块文件夹似乎是 unecesary
  • 我同意 antpaw 你应该添加一个全局视图和模型文件夹以便在应用程序之间共享它们
  • 我不明白为什么 autoloader 在 config 目录中而不是 lib 目录的一部分,您也可以将 boostrap.php 移动到 config 目录
  • 希望对你有帮助


    我建议您使用管理所有路由的 bootstrap.php,这样您就不会遇到诸如"我希望我可以在我的管理模块中再嵌套一个文件夹"之类的问题。

    我也不会使用模块并将默认控制器保留在控制器/目录中,并将管理控制器保留在控制器/管理目录中。模型和视图相同。

    顺便说一句,不在应用程序的不同部分之间共享模型真的很不聪明,它们在 99% 的情况下都是相同的。这就是mvc如此强大的原因。有时您甚至可以在前端和后端之间共享应用程序内部的一些视图部分。