Организация структуры каталогов API-ориентированного веб-приложения - PullRequest
1 голос
/ 15 апреля 2019

Ниже приведена структура каталогов для приложения PHP, которое я собрал из примеров, которые обеспечивают доступ через центральную (api.php) точку входа, пока нет пространств имен, а имена классов идентичны именам файлов .


Я разделил каталоги на

  • аутентификация (есть сценарии входа для обработки входа, выхода из системы, создания конфигурации пользователя
  • (настройки всего сайта,настройки базы данных)

  • контроллеры (содержит файлы классов, с функциями-членами, которые вызывают определенный метод данных)
  • модели (делает simple вызовы операции CRUD)
  • данные (composite методы работы, которые вызывают несколько simple вызовов методов)

  • утилиты (или «библиотеки», которые являются внешними по отношению к приложению)

  • vendor (я не знаю, как это назвать, ноон автоматически загружает класс)


Вот так

├── 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)Должен ли я хранить models отдельно от data для разделения простых составных операций?

2) Допустимо ли удалять суффикс Controller для каждого файла в каталоге Controllers?

3) За что именно отвечает модель, если не все операции CRUD с базой данных?

4) Наконец, куда должен идти вход, если отдельная конечная точка API?

Я видел много мест, где мы добавляем«Контроллер» в файл / класс.

Приведенный ниже класс автозагрузчика не распознает суффикс, а в маршруте 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, называемый данными, базой данных или чем-то подобным.

Модели данных - представляет отдельные объекты,содержит свойства, уникальные для модели, в базе данных приложения

Доменные логические модели - Представляет логические шаги и решения, которые относятся к приложению, включая проверку данных и сложные бизнес-правила

Mappers - обеспечивает доступ к источнику данных, такому как база данных,

Services - отвечает за предоставление модели данных или сбора для потребителя, выступая в качестве общедоступногоинтерфейс к внешней платформе или конечному клиенту

Пример структуры для части данных приложения

Пример скриншота из этой презентации Аарона Сарая.

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

Sample Database Application Screenshot

Этот вопрос также охватывает тему

Orgанимировать структуру каталогов моего веб-приложения на основе DDD?

...