我是在制作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 /
中似乎是不合逻辑的答案 0 :(得分:4)
这是一个极具争议的话题,但没有一个正确的答案。但是,我发布了以下提示:
vendor
目录用于第三方依赖,您不应该在其中编写自己的代码src
目录旁边的lib
或vendor
目录中MyVendorName\Controller
,MyVendorName\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)
<强>应用强>
这取决于您,您希望如何构建应用程序。
将您的资料放入src
或app
文件夹中是一种很好的做法。
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