如何构建MVC应用程序作曲家风格?

时间:2014-06-10 15:47:04

标签: php composer-php

我是在制作MVC网络应用程序的最初阶段。我想尝试做作曲家风格的事情。到目前为止,这是我的目录结构:

public_html
    |-vendor
    |   |-MyVendorName
    |   |   |-DomainObjectClass.php

这就是我存储域对象的地方。

我也尽可能地接近this question

的答案。

我有点困惑的地方是模型,控制器,视图,服务,DataMappers等的位置。我应该创建MyVendorName的子目录(例如MyVendoreName / DomainObjects / DomainObjectClass.php和MyVendorName / Services / SomeServiceClass.php等)或者将一个目录与供应商调用的类或src或其他东西分开并在那里做MVC的东西会更明智吗?

编辑:每个人都说供应商是第三方库,我明白了。但是我编写域对象的方式与MVC方面非常分离。事实上,他们甚至不知道他们是MVC应用程序的一部分。它们很容易在其他项目中重复使用(我打算这样做)。所以把它放在src /或app /

中似乎是不合逻辑的

5 个答案:

答案 0 :(得分:4)

这是一个极具争议的话题,但没有一个正确的答案。但是,我发布了以下提示:

  • vendor目录用于第三方依赖,您不应该在其中编写自己的代码
  • 将您自己的代码放在src目录旁边的libvendor目录中
  • 这些目录都不应该在公共webroot文件夹中; webroot应该是一个单独的目录,只包含公共服务文件,如CSS和JS文件,其他任何东西都在webroot之外
  • 在命名空间中构造您的类名
  • 命名空间中的
  • 遵循目录结构
  • 明确拥有MyVendorName\ControllerMyVendorName\Model等等有意义
  • 结构尽可能深刻,例如MyVendorName\Model\DomainObjects\Foobar\Subclass有道理

答案 1 :(得分:1)

我会建议这种方法:

project_dir
    |-vendor
    |    -(vendor directories, installed via composer)
    |-public_html (images, javascript, css, html files/angular views)
    |-app

app目录中,您可以放置​​PHP代码。在那里你可以组织你喜欢的控制器,服务,数据映射器,但是这个结构提供了从外部可以访问的内容(public_html)和应该只能由apache或cli执行的内容之间的严格分离(其他一切)。

正如@deceze所说,除了打破供应商目录和公共目录之外,你如何组织你的应用程序代码完全取决于你,并且应该匹配你最适合你完成的任务的任何内容。

答案 2 :(得分:1)

<强>应用

这取决于您,您希望如何构建应用程序。 将您的资料放入srcapp文件夹中是一种很好的做法。 MVC只是一种帮助方法,为它提供或多或少的干净文件夹结构。 您应该阅读有关PSR和名称空间的信息,以了解如何命名类。 如果遵循PSR标准,则可以直接关联这些文件中的文件夹名称,文件名和命名空间类名称。

/src
 - /controller
    - ModuleAController.php
    - ModuleBController.php
 - /model
 - /helper
 - /view
 - bootstrap.php
 - config.php
 - index.php

/src
 - /core
      - corefiles.php
      - ...
 - /modules
    -/aModule
      - /controller
      - /model
      - /helper
      - /view
 - bootstrap.php
 - config.php
 - index.php

<强>作曲

Composer是一个包管理器。你可以用它来获取包。这些包存储在vendor文件夹中。包在项目的composer.json文件中定义。您可以定义两个单独的需求部分:require,它定义项目的依赖项,require-dev,它定义了项目开发所需的依赖项。

Composer还可以作为整个项目(您的应用及其所有依赖项)的自动加载生成器。

{
    "autoload": {
        "psr-4": {"YourApplicationNamespace\\": "src/"}
    }
}

您只需要在项目的引导程序中的vendors文件夹中要求作曲家自动加载文件。

require 'vendor/autoload.php';

如果组件是独立且可重用的,您可以将它们创建为单独的编写器包,并在主应用程序中需要它们。例如,这将适用于记录器&#34;包。一些框架项目以这种方式组成他们的主项目。

Composer自定义安装程序

如果组件耦合到公共基础层(CMS或Framework),则可以使用自定义编写器安装程序,以便将软件包安装到正确的文件夹中。 您可以在此处找到大量文件夹布局和结构信息:http://github.com/composer/installers

project
  -vendor
      -(packages installed via composer)
  -public_html (assets and main index.php)
  -src
    - core
    - helpers
      (composer packages for this application, installed into specific folders)
    - themes
       - sunshine (theme package installed into themes folder)
    - modules
       - guestbook (module package installed into modules folder)

答案 3 :(得分:0)

我在下面列出了您可能喜欢的示例。在决定我的目录结构时,我在这里发现了一个有用的帖子: https://softwareengineering.stackexchange.com/a/123320

/app
 - /controller_http.php
 - /controller_cron.php

/data  # content uploaded by users or generated by scripts

/lib
 - /[MyName]/Controller/
 - /[MyName]/Myclass.php

/test

/vendor
 - /[vendorName]/assets/images/
 - /[vendorName]/ClassName.php
 - /[VendorName]/Module/

/www  # or /public_html
 - index.php
 - /css
   - [theme name]/stylesheet.css
   - [theme name]/images/ # images specific to a theme/stylesheet
 - /images # general images for any theme
 - /js

.gitignore
bootstrap.php
composer.json
licence.txt
README.md

应用程序可能从不同的上下文运行,例如:

来自浏览器的HTTP请求: index.php包含controller_http

Cron Job: controller_cron.php直接调用

API调用: controller_api.php来自www / api.php

在每种情况下,控制器都会包含bootstrap.php来定义目录路径和其他硬编码配置。然后,它将根据请求参数或命令行参数

运行相应的脚本

答案 4 :(得分:-2)

以下是用PHP编写的MVC应用程序示例,该应用程序严格遵循MVC原则:

https://github.com/fulldecent/cameralife

开发者指南解释了如何在文件中组织和应用MVC:https://github.com/fulldecent/cameralife/blob/master/CONTRIBUTING.md,但总结如下。

文件存储:

  • /.htaccess - 将所有请求发送到index.php
  • /index.php - 设置PSR-4自动加载器并将所有请求发送到控制器
  • /vendor/ - 你从Composer获得的东西
  • /assets/ - 图片和css文件(随意使用/images//css/
  • /caches/ - 临时文件(随意将其移到webroot之外)
  • /photos/ - 请忽略,这是我存储用户内容的另一个地方,这是特定于此照片共享应用
  • /sources/Controllers/ - 每个网址请求的路由目标
  • /sources/Models/ - 所有数据模型
  • /sources/View/ - Controllers使用这些并传递Models,它们通常会打印HTML