Я работал над 3-уровневой архитектурой и хотел бы получить некоторое подтверждение того, что мой подход верен, поскольку он предназначен для большого проекта, который, как мы надеемся, преобразует 10-летний код спагетти в организованную систему.
Код ниже был разделен на три уровня, и он прекрасно работает до сих пор. API (работает вместе с некоторым HTML & CSS и AJAX (уровень представления), уровень бизнес-логики и уровень доступа к данным. Я использую Slim, как вы можете видеть для API.
У меня есть несколько вопросов:
"SELECT x, y, z FROM ..."
содержаться в бизнес-уровне, как показано ниже, или в DataLayer, или бывают случаи, когда вам может потребоваться SQL как в BLL, так и в DAL? Я видел оба, но ограничение на BLL кажется более логичным разделением.company_id
, Что если я захочу company_id
а также isadmin
? Лучшей практикой будет связать другой маршрут и метод для этого, такие как /users/company/:id/admins
с другим методом, таким как getAdminUsers()
? Не кажется правильным, так как я мог передать параметры getUsers($id, $isadmin)
, но не уверен, что является лучшей практикой здесь.API
<?php
require $_SERVER["DOCUMENT_ROOT"] . '/BLL/BLL.php';
require 'Slim/Slim.php';
$app = new Slim();
$app->get('/users/company/:id', 'getUsers');
$app->get('/users/:id', 'getUser');
$app->post('/users', 'addUser');
$app->put('/users/:id', 'updateUser');
$app->delete('/users/:id', 'deleteUser');
$app->run();
function getUsers($id) {
$bll = new BusinessLayer();
$result = json_encode($bll->getAllUsersBLL($id));
echo '{"user": ' . $result . '}';
}
?>
Уровень бизнес-логики
<?php
require_once $_SERVER["DOCUMENT_ROOT"] . "/DAL/DAL.php";
class BusinessLayer
{
var $dal;
function __construct() {
$this->dal = new DataLayer();
}
public function getAllUsersBLL($id) {
$sql = "SELECT * FROM users WHERE company_id = :id ORDER BY id";
$ret = $this->dal->query($sql, $id);
return $ret;
}
}
}
?>
Уровень доступа к данным
<?php
class DataLayer
{
public function connect() {
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "testdatabase";
$db = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $db;
}
public function query($sql, $id) {
try {
$db = $this->connect();
$stmt = $db->prepare($sql);
$stmt->bindParam("id", $id);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$db = null;
return $result;
} catch(PDOException $e) {
echo '{"error":{"text":'. $e->getMessage() .'}}';
}
}
}
?>
Любые другие отзывы приветствуются!
Задача ещё не решена.
Других решений пока нет …