13. تمرین IMPOTS با XML
در این تمرین که قبلاً بارها آن را مطالعه کردهایم، سرور نتایج را به شکل یک جریان XML به کلاینت بازمیگرداند.
13.1. سرور (impots_05B_web)
وب سرویس محاسبه مالیات که قبلاً توصیف شد، دارای معماری لایهای است:
![]() |
در مثال قبلی، سرویس وب یکی از دو خط زیر را به مشتریان خود ارسال میکرد:
این یک سند XML صحیح نیست زیرا فاقد تگ ریشه است. سرویس وب جدید پاسخ خود را در قالب زیر بازخواهد گرداند:
یا
در هر دو حالت، پاسخ یک سند XML خوشساخت است که میتواند توسط ماژول [simpleXML] پردازش شود.
در طرح سهلایه، تنها لایه [web] نیاز به اصلاح دارد. کد آن، [impots_05B_web]، به صورت زیر درمیآید:
<?php
// لایه کسبوکار
require_once "impots_05_metier.php";
// پردازش خطا
ini_set("display_errors", "off");
// سربرگ UTF-8
header("Content-Type: text/plain; charset=utf-8");
// ------------------------------------------------------------------------------
// وب سرویس مالیاتی
// تعریف ثابتها
$HOTE = "localhost";
$PORT = 3306;
$BASE = "dbimpots";
$USER = "root";
$PWD = "";
//دادههای مورد نیاز برای محاسبه مالیات در جدول mysqL $TABLE قرار داده شدهاند.
//متعلق به پایگاه داده $BASE است. جدول دارای ساختار زیر است
//محدودیت decimal(10,2)، coeffR decimal(6,2)، coeffN decimal(10,2)
//پارامترهای اشخاص مشمول مالیات (وضعیت تأهل، تعداد فرزندان، حقوق سالانه)
//توسط کلاینت در قالب پارامترها=وضعیت تأهل، تعداد فرزندان، حقوق سالانه ارسال میشوند
//نتایج (وضعیت تأهل، تعداد فرزندان، حقوق سالانه، مالیات پرداختی) به مشتری بازگردانده میشوند
// در قالب <tax>tax</tax>
//یا در قالب <error>error</error>، اگر پارامترها نامعتبر باشند
//لایه [métier] در جلسه بازیابی میشود
session_start();
if (!isset($_SESSION['metier'])) {
// نمونه سازی لایه [dao] و لایه [métier]
try {
$_SESSION['metier'] = new ImpotsMetier(new ImpotsDaoWithMySQL($HOTE, $PORT, $BASE, $USER, $PWD));
} catch (ImpotsException $ie) {
print "<reponse><erreur>Erreur : " . utf8_encode($ie->getMessage() . "</erreur></reponse>");
exit;
}
}
$metier = $_SESSION['metier'];
//خط ارسالشده توسط کلاینت را بازیابی میکند
$params = utf8_encode(htmlspecialchars(strtolower(trim($_POST['params']))));
//print "پارامترهای دریافتی --> $params\n";
$items = explode(",", $params);
//باید فقط ۳ پارامتر وجود داشته باشد
if (count($items) != 3) {
print "<reponse><erreur>[$params] : nombre de paramètres invalides</erreur></reponse>\n";
exit;
}//اگر
//پارامتر اول (وضعیت تأهل) باید بله/خیر باشد
$marié = trim($items[0]);
if ($marié != "oui" and $marié != "non") {
print "<reponse><erreur>[$params] : 1er paramètre invalide</erreur></reponse>\n";
exit;
}//اگر
// پارامتر دوم (تعداد فرزندان) باید یک عدد صحیح باشد
if (!preg_match("/^\s*(\d+)\s*$/", $items[1], $champs)) {
print "<reponse><erreur>[$params] : 2ième paramètre invalide</erreur></reponse>\n";
exit;
}//اگر
$enfants = $champs[1];
//پارامتر سوم (حقوق) باید یک عدد صحیح باشد
if (!preg_match("/^\s*(\d+)\s*$/", $items[2], $champs)) {
print "<reponse><erreur>[$params] : 3ième paramètre invalide</erreur></reponse>\n";
exit;
}//اگر
$salaire = $champs[1];
// مالیات محاسبه میشود
$impôt = $metier->calculerImpot($marié, $enfants, $salaire);
// نتیجه را بازگردانید
print "<reponse><impot>$impôt</impot></reponse>\n";
//پایان
exit;
قالب پاسخ سرویس وب در خطوط ۳۵، ۴۷، ۵۳، ۵۸، ۶۴ و ۷۱ اصلاح شده است.
13.2. کلاینت (client_impots_05b_web)
کلاینت برای در نظر گرفتن فرمت جدید پاسخ اصلاح شده است. از [simpleXML] برای پردازش این مورد استفاده میشود:
<?php
//مالیات مشتری
// مدیریت خطا
ini_set("display_errors", "off");
// ---------------------------------------------------------------------------------
// یک کلاس از توابع کمکی
class Utilitaires {
...
}
// main -----------------------------------------------------
// تعریف ثابتها
$DATA = "data.txt";
$RESULTATS = "resultats.txt";
// دادههای سرور
$HOTE = "localhost";
$PORT = 80;
$urlServeur = "/exemples-web/impots_05B_web.php";
...
exit;
function calculerImpot($HOTE, $PORT, $urlServeur, &$cookie, $params) {
// کلاینت را به ($HOTE, $PORT, $urlServeur) متصل میکند
// کوکی $cookie را در صورتی که خالی نباشد ارسال میکند. $cookie به صورت ارجاعی پاس میشود
//خط نتیجه را به سرور ارسال میکند
//خط نتیجه را پردازش میکند
...
//خط نتیجه را میخواند
$ligne = fgets($connexion, 1000);
//اتصال بسته میشود
fclose($connexion);
//نتیجه را محاسبه میکند
$xml = new SimpleXMLElement($ligne);
$erreur = isset($xml->erreur) ? $xml->erreur : "";
$impôt = isset($xml->impot) ? $xml->impot : "";
//بازگشت
return array($erreur, $impôt);
}
- خط ۳۲: پاسخ سرور خوانده میشود. این یک سند XML است.
- خط ۳۶: یک شیء SimpleXML از سند دریافتشده XML ساخته میشود.
- خط ۳۷: هر پیام خطا
- خط ۳۸: هر مبلغ مالیاتی
