下面是我从示例中拼凑而成的PHP应用程序的目录结构,该示例通过中央(api.php)入口点提供了可访问性,还没有名称空间,并且类名与文件名相同。
我将目录分成了
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)是否应该将models
与data
分开以分开简单的复合操作?
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
此问题还涉及主题</ p>
Organizing the directory structure of my DDD-based web application?