
من هذا الدرس سوف تتعلم كيفية إنشاء واجهة برمجة تطبيقات 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 مثيرًا للمستخدمين ، فسيتم تطويره. أنا أيضا في انتظار العلاقات العامة من كل من يريد المساعدة.