PHP的三层架构文件夹结构


PHP 3-tier architecture folder structure

我在PHP开始一个家庭网站项目,我打算用3层架构来做。但是我在这种架构中找不到任何关于文件夹结构的标准/偏好的信息。我工作的地方使用的文件夹结构是这样的:

(文件夹被夹住)

    管理>
    • 包括
      • auth.php
    • page1
      • index . php
    • 所以page2
    • index . php
  • 包括
      css
      • style.css
    • js
      • jquery-ui-10.4.0定制
      • javascript.js
    • responsive_gs
    • global.php
    • 页脚
  • 自由
    >
    • bll
      • class1.bll.php
      • class2.bll.php
      • class3.php
    • 木豆
      • class1.dal.php
    • 包括
      • auth.php
    • page1
      • index . php
    • 所以page2
    • index . php
  • index . php

并且感觉非常可维护。但是在我开始这个项目之前,我还是想听听大家的意见。

这个问题被搁置了,因为它显然无法用客观的方式回答。我很抱歉,我以为在这件事上有一些行业标准。

它看起来不像PSR-0或PSR-4工作得很好,你可以在这里阅读更多关于PSR的信息。我认为PSR-0或PSR-4应该得到实践,因为它允许您在轻松创建代码的同时完成模块化的文件夹结构,其他人和您都可以重复使用,所需的设置最少。

通过识别应用程序的核心组件,我开始为项目创建文件夹结构。例如,使用登录系统进行身份验证、注册、发送密码提醒等是很常见的……一旦我心中有了一个模块,我就创建一个或多或少遵循以下模式的编写器包:

src/
    Assets/
        css/
        js/
        less/
        sass/
    Controllers/
        AuthController.php
        UserController.php
    Repositories/
        UserRepository.php
    Services/
    Views/
        partials/
            login.blade.php
            status-menu.blade.php
        password/
            recover.blade.php
            reset.blade.php
    MyServiceProvider.php
    routes.php
composer.json

为了让composer自动加载您的名称空间,您需要指定符合PSR-0或PSR-4的路径。例如,在我的login包上面我的作曲家。Json文件看起来像这样:

{
    "name": "robert/login",
    "description": "description",
    "authors": [
        {
            "name": "Robert Stanfield",
            "email": "your@email.com"
        }
    ],
    "require": {
        "php": ">=5.4.0"
    },
    "autoload": {
        "psr-4": {
           "Robert''Login''": "src/"
        }
    },
    "minimum-stability": "stable"
}

注意自动加载部分的psr-4行…您可以通过composer文档查看更多信息。

现在我把所有的代码放在一个版本控制系统,如SVN或GIT,所以我可以在任何其他项目中使用它。

你的主要项目可以是一个锅炉板项目,可以在项目之间重用…像这样:

composer.json
index.php
public/
vendor/

现在你可能想要创建一个Core包或一些类似的名称,包含你的应用程序的特定代码,不能在其他项目中使用。

你的index.php文件看起来像这样:

// Use composer's autoloader
require('vendor/autoload.php');
// Code to handle loading all your service providers...
// maybe have like an array of service providers and then foreach over them...
现在我可以简单地使用UserRepository类,例如通过编写以下代码:
use Robert'Login'Repositories'UserRepository;
class UserController
{
    protected $userRepo;
    public function __construct(UserRepository $repo)
    {
        $this->userRepo = $repo;
    }

    public function showInactiveUsers()
    {
        $users = $this->userRepo->getInactiveUsers();
        // TODO: generate $view
        return $view;
    }
}

请记住,您可以使用composer在自己的包中要求包,因此解耦代码应该没有问题。通过使用composer,您可以相对轻松地获得使用PHP社区已经创建的包的额外好处。

主项目的composer.json文件应该需要你创建的包…例如,如果我的登录包位于git://example.com/robert/login.git

{
    "minimum-stability": "stable",
    "repositories": [
        {
            "type": "git",
            "url": "git://example.com/robert/login.git"
        }
    ],
    "require": {
        "robert/login": "dev-master"
    }
}

Composer可以安装任何版本的包…你也可以在composer文档中了解更多,它基本上与你的标签和分支名称一起工作:)

您将需要创建一个程序来编译和/或缩小您的资产,并将它们放在公共文件夹中。这减少了HTTP请求,并在纯JavaScript或CSS的情况下减少了带宽。您可以使用诸如gulp之类的工具来完成此任务。

希望我涵盖了所有…这是一个相当大的想法,但一个简单的:)