
من هذا الدرس سوف تتعلم كيفية إنشاء واجهة برمجة تطبيقات RESTful بسرعة لأي موقع على أي CMS ، MODX هو مجرد مثال.
لإنشاء واجهة برمجة التطبيقات ، سأستخدم:
النتيجة هنا:
https://github.com/andchir/modx2-api
فعلت كل ما هو موصوف على نظام Linux ، لكنني أعتقد أن الاختلاف في الأوامر على نظام Windows لن يكون كبيرًا. قمت مسبقًا بتثبيت الملحن وأداة Symfony .
إنشاء فصول المشروع والمستخدم
أقوم بإنشاء مشروع:
composer create-project symfony/skeleton modx2-api 
قم بتثبيت الحزم اللازمة لإنشاء واجهة برمجة التطبيقات:
 cd modx2-api composer req api composer req migrations composer req form composer req maker --dev 
أبدأ الخادم المحلي.
إذا تم تثبيت الأداة المساعدة Symfony:
 symfony server:start 
او نحو ذلك:
 php -S 127.0.0.1:8000 -t public 
أفتح العنوان في المتصفح للتحقق من أن كل شيء يعمل:
http://127.0.0.1:8000/
أفتح ملف .env وقم بتحرير سلسلة الاتصال إلى قاعدة بيانات المشروع على MODX :
 DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name 
تحتاج الآن إلى إنشاء مستخدم وتكوين نظام التفويض عن طريق تسجيل الدخول وكلمة المرور.
تثبيت حزم إضافية:
 composer req jwt-auth composer req orm-fixtures --dev composer req profiler --dev 
ظهرت خيارات حزمة .jvt-certification-bundle الجديدة في ملف .env .
أقوم بإنشاء فئات الكيان ومستودع التخزين (Doctrine ORM) للمستخدم:
 php bin/console make:user 
ظهر ملفان:
 src/Entity/User.php src/Repository/UserRepository.php 
أقوم بإنشاء جدول "المستخدم" في قاعدة البيانات:
 bin/console doctrine:schema:create 
أقوم بتكوين ترخيص المستخدم وفقًا للتعليمات:
رمز وحدة التحكم App \ Controller \ SecurityController <?php namespace App\Controller; use App\Entity\User; use App\Form\Type\LoginType; use App\Form\Type\UpdateProfileType; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; use Symfony\Component\Validator\Validator\ValidatorInterface; class SecurityController extends AbstractController {  public function loginAction(AuthenticationUtils $authenticationUtils): Response { if ($this->getUser()) { return $this->redirectToRoute('api_entrypoint'); } $form = $this->createForm(LoginType::class); $error = $authenticationUtils->getLastAuthenticationError(); $lastUsername = $authenticationUtils->getLastUsername(); return $this->render('security/login.html.twig', [ 'form' => $form->createView(), 'last_username' => $lastUsername, 'error' => $error ]); } } 
 أقوم بإنشاء فصل لإنشاء المستخدمين:
 php bin/console make:fixtures 
مزيد من التفاصيل هنا: https://symfony.com/doc/current/security.html#a-create-your-user-class
فئة رمز التطبيق \ DataFixtures \ UserFixtures <?php namespace App\DataFixtures; use App\Entity\User; use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Common\Persistence\ObjectManager; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; class UserFixtures extends Fixture { private $passwordEncoder; public function __construct(UserPasswordEncoderInterface $passwordEncoder) { $this->passwordEncoder = $passwordEncoder; } public function load(ObjectManager $manager) { $user = new User(); $user ->setEmail('admin@admin.com') ->setRoles(['ROLE_USER', 'ROLE_ADMIN']); $user->setPassword($this->passwordEncoder->encodePassword( $user, 'admin' 
 أقوم بإنشاء مسؤول بعنوان البريد الإلكتروني "admin@admin.com" وكلمة المرور "admin" :
 php bin/console doctrine:fixtures:load --append --group=UserFixtures 
في وقت لاحق يمكن تغيير هذه البيانات.
أقوم بإنشاء المفاتيح في config / jwt / folder:
 jwt_passhrase=$(grep ''^JWT_PASSPHRASE='' .env | cut -f 2 -d ''='') echo "$jwt_passhrase" | openssl genpkey -out config/jwt/private.pem -pass stdin -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096 echo "$jwt_passhrase" | openssl pkey -in config/jwt/private.pem -passin stdin -out config/jwt/public.pem -pubout setfacl -R -mu:www-data:rX -mu:"$(whoami)":rwX config/jwt setfacl -dR -mu:www-data:rX -mu:"$(whoami)":rwX config/jwt 
التحقق من إنشاء الرمز المميز:
 curl -X POST -H "Content-Type: application/json" http://localhost:8000/authentication_token -d '{"email":"admin@admin.com","password":"admin"}' 
أقوم بإنشاء ترحيل:
 php bin/console make:migration 
الآن الجزء الممتع.
API وتوليد الوثائق
أقوم بإنشاء فئات الكيانات لجميع جداول قاعدة البيانات:
 php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity 

أقوم بإنشاء مجموعات ورسامات للفصول الدراسية:
 php bin/console make:entity --regenerate App 
أفتح رمز فئة واحدة ، على سبيل المثال src / Entity / ModxSiteContent.php . أضف تعليق توضيحي ApiResource :

API ل ModxSiteContent جاهز.
أفتح الصفحة http: // localhost: 8000 / api

أأخذ الرمز المميز ، انقر فوق الزر "تفويض" ، وأدخل السطر بالرمز المميز:
 Bearer MY_TOKEN 

انقر فوق الزر "جربه" ثم زر "تنفيذ" . أحصل على هذه النتيجة:

علاقات الجدول
لن أصف كيفية إنشاء عوامل التصفية حتى لا يتم تكرار الوثائق ، ولكن سأقدم مثالًا على كيفية إنشاء علاقات للجداول ، لأن انها اصعب قليلا.
في حالة MODX ، يتم تخزين بيانات المستخدم في جدول منفصل "user_attributes" . على سبيل المثال ، أحتاج إلى إضافة بريدهم الإلكتروني والاسم ورقم الهاتف وما إلى ذلك إلى عينة من المستخدمين حسب طلب GET. أفتح App \ Entity \ ModxUsers رمز الفئة ، وأضف $attributes للخاصية الخاصة وأصف الاتصال بفئة App \ Entity \ ModxUserAttributes في التعليق التوضيحي "ORM \ OneToOne":
  private $attributes; 
مرة أخرى أقوم بإضافة الحروف المفقودة والمستوطنين:
 php bin/console make:entity --regenerate App\\Entity\\ModxUsers 
يرجى ملاحظة أنني أضفت مجموعة "السمات" إلى التعليق التوضيحي @ApiResource
أفتح رمز الفئة App \ Entity \ ModxUserAttributes ، أضف الشرح @ApiResource والاتصال مع الفئة App\Entity\ModxUsers :
  private $user; 
بالنسبة لجميع الخصائص التي تحتاج إلى إضافتها إلى التحديد ، أدرج التعليق التوضيحي @Groups({"attributes"}) .
النتيجة:

نتيجة لذلك ، للحصول على إذن في التطبيق الخاص بك ، تحتاج أولاً إلى إرسال معلومات تسجيل الدخول (البريد الإلكتروني) وكلمة المرور إلى عنوان URL "/ certification_token" ، والحصول على رمز مميز ، ثم إرسال هذا الرمز المميز في كل طلب في رأس "التخويل" :

إذا كان المشروع https://github.com/andchir/modx2-api مثيرًا للمستخدمين ، فسيتم تطويره. أنا أيضا في انتظار العلاقات العامة من كل من يريد المساعدة.