أدوات تطوير PHP الحديثة: Composer, PHPUnit, و Xdebug
أدوات تطوير PHP الحديثة: Composer, PHPUnit, و Xdebug
دليل متخصص من علاء عامر - مطور ومصمم مواقع وتطبيقات احترافية
الأدوات الحديثة في تطوير PHP تجعل العمل أكثر كفاءة وجودة. في هذا المقال، سنستكشف أهم الأدوات التي يحتاجها كل مطور PHP محترف.
2️⃣ PHPUnit: اختبار الوحدات والتكامل
إعداد PHPUnit:
<!-- phpunit.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.0/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
testdox="true">
<testsuites>
<testsuite name="Unit Tests">
<directory suffix="Test.php">tests/Unit</directory>
</testsuite>
<testsuite name="Feature Tests">
<directory suffix="Test.php">tests/Feature</directory>
</testsuite>
</testsuites>
<source>
<include>
<directory suffix=".php">src</directory>
</include>
<exclude>
<directory>src/Config</directory>
<file>src/bootstrap.php</file>
</exclude>
</source>
<coverage>
<report>
<html outputDirectory="coverage-html"/>
<text outputFile="coverage.txt"/>
</report>
</coverage>
<php>
<env name="APP_ENV" value="testing"/>
<env name="DB_DATABASE" value="test_database"/>
</php>
</phpunit>
مثال على اختبار الوحدة:
<?php
// tests/Unit/CalculatorTest.php
use PHPUnit\Framework\TestCase;
use App\Calculator;
class CalculatorTest extends TestCase
{
private Calculator $calculator;
protected function setUp(): void
{
$this->calculator = new Calculator();
}
public function testAddition()
{
$result = $this->calculator->add(2, 3);
$this->assertEquals(5, $result);
}
public function testSubtraction()
{
$result = $this->calculator->subtract(10, 4);
$this->assertEquals(6, $result);
}
public function testDivision()
{
$result = $this->calculator->divide(15, 3);
$this->assertEquals(5, $result);
}
public function testDivisionByZero()
{
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Division by zero is not allowed');
$this->calculator->divide(10, 0);
}
public function testMultiplication()
{
$result = $this->calculator->multiply(4, 7);
$this->assertEquals(28, $result);
}
/**
* @dataProvider additionProvider
*/
public function testAddWithDataProvider($a, $b, $expected)
{
$result = $this->calculator->add($a, $b);
$this->assertEquals($expected, $result);
}
public function additionProvider()
{
return [
[1, 2, 3],
[5, 5, 10],
[-2, 3, 1],
[0, 0, 0]
];
}
}
اختبار التكامل مع قاعدة البيانات:
<?php
// tests/Feature/UserRepositoryTest.php
use PHPUnit\Framework\TestCase;
use App\Repository\UserRepository;
use App\Models\User;
class UserRepositoryTest extends TestCase
{
private PDO $pdo;
private UserRepository $userRepository;
protected function setUp(): void
{
// إنشاء قاعدة بيانات في الذاكرة للاختبار
$this->pdo = new PDO('sqlite::memory:');
$this->pdo->exec('
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
');
$this->userRepository = new UserRepository($this->pdo);
}
public function testCreateUser()
{
$userData = [
'name' => 'علاء عامر',
'email' => '[email protected]'
];
$user = $this->userRepository->create($userData);
$this->assertInstanceOf(User::class, $user);
$this->assertEquals('علاء عامر', $user->getName());
$this->assertEquals('[email protected]', $user->getEmail());
$this->assertNotNull($user->getId());
}
public function testFindUserById()
{
// إنشاء مستخدم أولاً
$userData = ['name' => 'Test User', 'email' => '[email protected]'];
$createdUser = $this->userRepository->create($userData);
// البحث عن المستخدم
$foundUser = $this->userRepository->findById($createdUser->getId());
$this->assertInstanceOf(User::class, $foundUser);
$this->assertEquals($createdUser->getId(), $foundUser->getId());
}
public function testUserNotFound()
{
$user = $this->userRepository->findById(999);
$this->assertNull($user);
}
protected function tearDown(): void
{
$this->pdo = null;
}
}
اختبار مع Mock Objects:
<?php
// tests/Unit/EmailServiceTest.php
use PHPUnit\Framework\TestCase;
use App\Services\EmailService;
use App\Contracts\MailerInterface;
use App\Models\User;
class EmailServiceTest extends TestCase
{
public function testSendWelcomeEmail()
{
// إنشاء Mock للـ Mailer
$mailerMock = $this->createMock(MailerInterface::class);
// تحديد التوقعات
$mailerMock->expects($this->once())
->method('send')
->with(
$this->equalTo('[email protected]'),
$this->stringContains('مرحبا'),
$this->anything()
)
->willReturn(true);
$emailService = new EmailService($mailerMock);
$user = new User('علاء عامر', '[email protected]');
$result = $emailService->sendWelcomeEmail($user);
$this->assertTrue($result);
}
public function testSendEmailFailure()
{
$mailerMock = $this->createMock(MailerInterface::class);
$mailerMock->method('send')->willReturn(false);
$emailService = new EmailService($mailerMock);
$user = new User('Test User', '[email protected]');
$result = $emailService->sendWelcomeEmail($user);
$this->assertFalse($result);
}
}
4️⃣ PHP_CodeSniffer: فحص جودة الكود
تثبيت واستخدام:
# تثبيت عبر Composer
composer require --dev squizlabs/php_codesniffer
# فحص الكود
./vendor/bin/phpcs --standard=PSR12 src/
# إصلاح المشاكل تلقائياً
./vendor/bin/phpcbf --standard=PSR12 src/
# إنشاء ملف إعداد مخصص
./vendor/bin/phpcs --config-set default_standard PSR12
ملف إعداد phpcs.xml:
<?xml version="1.0"?>
<ruleset name="Custom Standard">
<description>معايير الكود المخصصة للمشروع</description>
<!-- الملفات والمجلدات للفحص -->
<file>src</file>
<file>tests</file>
<!-- استثناء ملفات معينة -->
<exclude-pattern>src/Config/</exclude-pattern>
<exclude-pattern>*/vendor/*</exclude-pattern>
<!-- استخدام PSR12 كأساس -->
<rule ref="PSR12"/>
<!-- قواعد مخصصة -->
<rule ref="Generic.Files.LineLength">
<properties>
<property name="lineLimit" value="120"/>
<property name="absoluteLineLimit" value="150"/>
</properties>
</rule>
<!-- منع استخدام var_dump -->
<rule ref="Squiz.PHP.ForbiddenFunctions">
<properties>
<property name="forbiddenFunctions" type="array">
<element key="var_dump" value="null"/>
<element key="print_r" value="null"/>
<element key="die" value="exit"/>
</property>
</properties>
</rule>
</ruleset>
6️⃣ PHPStan: تحليل الكود الثابت
# تثبيت
composer require --dev phpstan/phpstan
# تشغيل التحليل
./vendor/bin/phpstan analyse src --level=8
# إنشاء ملف إعداد
./vendor/bin/phpstan analyse --generate-baseline
💡 أفضل الممارسات للأدوات
- أتمتة كل شيء: استخدم scripts في composer.json
- فحص مستمر: ادمج الأدوات في CI/CD
- معايير موحدة: اتبع PSR وقواعد الفريق
- اختبار شامل: غطي 80%+ من الكود
- توثيق الأدوات: اشرح الاستخدام للفريق
الخطوة التالية
تعلم Docker و Kubernetes لـ containerization و deployment متقدم.
📩 تحتاج مساعدة في إعداد بيئة تطوير متقدمة؟
قسم المقالة
أدوات تطوير PHP الحديثة: Composer, PHPUnit, و Xdebug
دليل شامل لأهم أدوات تطوير PHP الحديثة وكيفية استخدامها لتحسين سير العمل والجودة.
التواصل والاستشارة
تواصل مباشر عبر الواتساب أو الهاتف لفهم احتياجات مشروعك بدقة.
التخطيط والجدولة
وضع خطة عمل واضحة مع جدول زمني محدد لكل مرحلة من المشروع.
البرمجة والتطوير
تطوير المشروع بأحدث التقنيات لضمان الأداء والأمان العاليين.
المراجعة والتسليم
ختبار شامل ومراجعة دقيقة قبل التسليم النهائي للمشروع.