Ниже приведена структура каталогов для приложения 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

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