PHP MVC 框架的文件夹结构……我这样做对吗?

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

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

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

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

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

'理论'框架结构

- .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

  - scriptsapp/

 areas/

   admin/

     controllers/

     views/

   staff/

     controllers/

     views/

 controllers/

 models/

 views/

//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/

  }



}

详情

  • 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

文件夹结构有点像这样:

- .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

  - scriptsapp/

 areas/

   admin/

     controllers/

     views/

   staff/

     controllers/

     views/

 controllers/

 models/

 views/

//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/

  }



}

管理路由的一个解决方案是 CakePHP 所做的,

您首先为管理字符串定义一个配置

然后在您的控制器中使用具有特定命名转换的操作

- .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

  - scriptsapp/

 areas/

   admin/

     controllers/

     views/

   staff/

     controllers/

     views/

 controllers/

 models/

 views/

//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如此强大的原因。有时您甚至可以在前端和后端之间共享应用程序内部的一些视图部分。


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161