【问题标题】:Directory structure for a PHP website using composer, gulp and Travis使用 composer、gulp 和 Travis 的 PHP 网站的目录结构
【发布时间】:2015-07-14 08:25:07
【问题描述】:

我正在尝试找出一个 php 网站的目录结构。

网站将使用:

  • 一个非常基础的php MVC框架(即MinimalMVC,不过我在找一个通用的解决方案,所以框架大概可以忽略)
  • composer 管理 PHP 依赖项
  • 用于样式的 SCSS
  • gulp 编译 SCSS(用于开发构建),并缩小和连接 JS 和 CSS 输出以及缩小图像等(仅用于部署构建)
  • Travis CI 用于 CI 内容

因此,经过大量思考、计划和查看我想出的不同类型目录结构的问题后,我仍然找不到符合我标准的东西:

  • gulp deploy 应该能够生成一个部署文件夹,当将其放入 Apache 服务器上的 /var/www/html/ 目录时,应该可以正常工作TM

    注意:MinimalMVC(以及 CodeIgniter 和其他类似框架)要求它们的 index.php 文件位于根目录中,appsys 文件夹位于同一目录中

  • 1234563基本上,PHP 部分不会保留 gulp,我希望它不受 gulp 的影响。

现在,我的想法有点乱,因为我一直在想这个太多,所以请原谅我这个问题也有点乱,但基本问题是,目录结构应该如何看?

一个想法:

.
|-- composer.json
|-- gulpfile.js
|-- package.json
|-- src
|   |-- app
|   |   |-- controllers
|   |   |-- models
|   |   `-- <other_framework_stuff>
|   |-- assets
|   |   |-- css
|   |   |-- img
|   |   |-- js
|   |   `-- raw
|   |       `-- scss
|   |-- index.php
|   `-- sys
|       `-- <framework_stuff>
|-- test
`-- vendor
    `-- <composer_stuff>

在这种结构中,开发人员只能在/src 目录中工作。 SCSS 从/src/assets/raw/scss/ 编译到src/assets/css。这样,PHP 仍然从构建过程中移除。当尝试生成deploy 目录时,src 文件夹被复制过来,/src/assets/raw/(所以没有/build/assets/raw)目录不存在,生产/部署就绪的 CSS、JS 和图像在@987654338 中找到@。

此解决方案的第一个问题是奇怪的src/assets/raw 目录,恕我直言,这看起来很丑陋。第二个问题是/vendor 目录。这意味着 php 引用了来自外部 src 的东西。因此,如果/src/index.php 负责处理它,它将包括../vendor/autoload.php。那么这意味着相同的代码被复制到/build/index.php。然后/build/ 不会通过将其放入/var/www/html 来运行,除非vendor/var/www 中,这看起来很奇怪。

我想到了很多其他的东西,但所有这些看起来都难看。为避免这个问题太长,我就到此为止。

请帮忙。我应该在composer.json 中使用vendor-dirvendor 放入/src/ 吗? (我知道,eww。)我应该使用什么样的目录结构?

【问题讨论】:

  • 您应该从现有框架中汲取灵感,例如 Laravel 使用的结构与您正在做的非常接近:laravelbook.com/laravel-architecture BTW,如果可以的话,我建议您不要将 vendor 文件夹放在您的build 目录,然后在生产服务器中运行composer install
  • @Korri,谢谢,这有帮助。
  • 同意@Korri 的评论。只要您提交您的 composer.lock 文件,composer install 在部署时应该不会花费很长时间。与您的问题没有直接关系,但我要更改的主要内容是将实际从 Web 服务器静态访问的内容与 @ 分开987654354@。这将保护您免受试图直接访问 php 文件的用户的影响,而这正是许多安全问题发生的地方。 Web 服务器将被配置为以文档根目录访问 public 目录。大多数框架都遵循这种设置方式。
  • 我的应用程序根目录中通常有一个boilerplate 目录,其中包含开发资产,例如lessjavascriptsbower.jsonpackages.jsonfonts、@ 987654362@,然后我要么使用gruntgulp 处理它们并将它们发送到dist/ 目录。
  • 将您的 index.php 放入一个文件夹中。 /public/index.php .. 我认为一个好的框架应该允许开发者选择最好的目录结构。例如在 Laravel 中,你可以对目录结构做任何你想做的事情。框架的行为不应该影响目录结构,它应该很容易定制。

标签: php composer-php gulp build-process


【解决方案1】:

我同意上面 Korri 的评论,因为您可以从现有框架中汲取灵感。

就我个人而言,这种目录结构感觉不错。

.
|-- composer.json
|-- gulpfile.js
|-- package.json
|-- changelog.md
|-- readme.md
|-- /src (This is the API code that *I'm* responsible for, and that I *own*.).
|   |-- /app
|   |   |-- /controllers
|   |   |-- /models
|   |   `-- <other_framework_stuff>
|   /public (Keeping this outside of the src dir, means that you can give this to your front-end devs without needing to have the entire codebase).
|   |   |-- /styles
|   |   |-- /images
|   |   |-- /js
|   /config (Put all configuration files outside of the src scope, so you can keep it outside of source control)
|   /build (CI build related configuration)
|   |   |--phpcs.xml
|   |   |--phpdocx.xml
|-- /tests (separating out your tests in this way can help you run tests separately, more easily)
|   |   |--acceptance
|   |   |--integration
|   |   |--unit
|-- /vendor (Depenedencies installed via Composer)

确实,您的问题没有社区驱动的正确答案。正确答案是特定于您的 业务、 工作的团队以及项目本身。

我绝不会将/vendor 目录放在您的/src 目录中——因为您不拥有它。您不对项目依赖项中代码的更改负责,因此应将其留在项目墙之外的自己的范围内。

使用PSR-4 自动加载,您的目录结构实际上并不重要,它可以随时轻松更改,不会影响您的代码。所以,试验一下,看看 感觉 适合你。

【讨论】:

    猜你喜欢
    • 2014-04-30
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2011-05-01
    相关资源
    最近更新 更多