组织以API为中心的Web应用程序的目录结构

时间:2019-04-14 23:35:36

标签: php api model-view-controller domain-driven-design directory-structure

下面是我从示例中拼凑而成的PHP应用程序的目录结构,该示例通过中央(api.php)入口点提供了可访问性,还没有名称空间,并且类名与文件名相同


我将目录分成了

  • 身份验证(具有用于处理登录,注销,创建用户的登录脚本
  • config(站点范围设置,数据库设置)


  • 控制器(保存类文件,具有调用特定数据方法的成员函数)
  • 模型(进行simple CRUD操作调用)
  • 数据(composite操作方法,它调用多个simple方法调用)


  • 实用程序(或“库”,在应用程序外部)

  • 供应商(我不知道该怎么称呼,但是它会自动加载一个类)


喜欢

├── api.class.php                  <------------- Routes all requests to  controller method using HTTP method name (GET, PUT, POST, DELETE)            
├── api.php                        <------------- Calls processRequest from api.class.php
├── authentication                  
│   └── authenticate.php           <------------- Specifies log in, logout, register logic          
├── config                          
│   └── database.php                
├── controllers
│   ├── <nameof>Controller.php     <------------- Calls a data method from data class (actionitems.php for example)
│   ├── LoginController.php        <------------- Call specific authenticate.php methods
├── data
│   ├── actionitems.php            <------------- Calls several model operations
│   └── users.php
├── models
│   └── actionitem.php             <------------- Contains matching attributes with table in database, and simple CRUD methods
├── utilities                            
│   └── <nameoflibrary>.php                                      
└── vendor                            
    └── autoloader.php             <------------- Loads the class needed without namespace

出现一些澄清的问题...


1)是否应该将modelsdata分开以分开简单的复合操作?

2)是否可以删除Controllers目录中每个文件的Controller后缀?

3)如果不是所有数据库CRUD操作,该模型究竟负责什么?

4)最后,如果有单独的API端点,应该登录哪里?

我已经看到过很多地方,我们将“ Controller”附加到文件/类中。

下面的autoloader类无法识别后缀,并且url路由没有使用整个控制器名称,实际上,它具有数据类名称(多个模型文件名)。


api.php(主要入口点)

<?php
    require_once 'vendor/autoloader.php';
    require_once 'api.class.php';

    class MyAPI extends api
    { 
        public function  __construct($request){
            parent::__construct($request);
        }
    }

    $api = new MyAPI($_REQUEST);
    echo $api->processRequest();

api.class.php

<?php
    abstract class api
    {
        protected $endpoint = array();
        protected $verb = '';
        protected $args = array();
        protected $file = null;
        protected $id = null;

        public function __construct(){
           //gets the specific HTTP method type and assigns the url pieces to properties of api class
        }

        public function processRequest() {
           if(count($this->endpoint) > 0){
               $class = $this->endpoint[0];
               if (class_exists($this->endpoint[0], true)) {
                   $method = strtolower($this->method);
                   if (method_exists($class, $method))
                       return $this->_response((new $class())->{$method}($this->id));
                   }
                   return $this->_response("No Endpoint: {$this->endpoint[0]}", 404);
               }
           }
       }
   }

autoloader.php

<?php
    class autoloader
    {
        private $directoryName;
        public function __construct($directoryName)  
        {
            $this->directoryName = $directoryName;
        }  
        public function autoload($className)
        {
            $fileName = strtolower($className).'.php';
            $file = $this->directoryName.'/'.$fileName;
            if (file_exists($file) == false)
            {
                return false;
            }
            include ($file);
        }    
    }
    # nullify any existing autoloads
    spl_autoload_register(null, false);
    # instantiate the autoloader object
    $classes = [
                    new autoloader('config'),
                    new autoloader('data'), 
                    new autoloader('models'), 
                    new autoloader('controllers')
    ];
    # register the loader functions
    foreach ($classes as $class)
        spl_autoload_register(array($class, 'autoload'));

编辑:

在对企业模式的主题进行了更多研究之后,我决定将数据库目录分解为单独的层。我将需要决定如何在应用程序中组织目录,有可能将其移动到称为数据,数据库或类似名称的api下的父目录。

数据模型-表示应用数据库中包含模型唯一属性的单个实体

域逻辑模型-表示逻辑步骤和决策 与应用有关的内容,包括数据验证和复杂的业务规则

映射器-提供对数据源(如数据库)的访问权限,

服务-负责向消费者提供数据模型或集合,充当外部框架或最终客户的公共接口

应用程序数据部分的示例结构

示例屏幕截图来自Aaron Saray的演示文稿。

https://www.slideshare.net/aaronsaray/midwest-php-2013

Sample Database Application Screenshot

此问题还涉及主题<​​/ p>

Organizing the directory structure of my DDD-based web application?

0 个答案:

没有答案