pdo — 3-х уровневая архитектура с PHP и Slim

Я работал над 3-уровневой архитектурой и хотел бы получить некоторое подтверждение того, что мой подход верен, поскольку он предназначен для большого проекта, который, как мы надеемся, преобразует 10-летний код спагетти в организованную систему.

Код ниже был разделен на три уровня, и он прекрасно работает до сих пор. API (работает вместе с некоторым HTML & CSS и AJAX (уровень представления), уровень бизнес-логики и уровень доступа к данным. Я использую Slim, как вы можете видеть для API.

У меня есть несколько вопросов:

  1. Вообще, это правильный способ заставить слои работать вместе?
  2. Если сам запрос SQL "SELECT x, y, z FROM ..." содержаться в бизнес-уровне, как показано ниже, или в DataLayer, или бывают случаи, когда вам может потребоваться SQL как в BLL, так и в DAL? Я видел оба, но ограничение на BLL кажется более логичным разделением.
  3. В приведенном ниже примере вы можете видеть, что я получаю пользователей по 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() .'}}';
}
}
}
?>

Любые другие отзывы приветствуются!

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector