كيفية إنشاء واجهة برمجة تطبيقات RESTful على النظام الأساسي لـ Symfony 5 + API لمشروع MODX


من هذا الدرس سوف تتعلم كيفية إنشاء واجهة برمجة تطبيقات 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 { /** * @Route("/login", name="app_login") * @param AuthenticationUtils $authenticationUtils * @return Response */ 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'//  )); $manager->persist($user); $manager->flush(); } } 

أقوم بإنشاء مسؤول بعنوان البريد الإلكتروني "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":


 /** * @var ModxUserAttributes * * @ORM\OneToOne(targetEntity="ModxUserAttributes", mappedBy="user") * @Groups({"read", "attributes"}) */ private $attributes; 

مرة أخرى أقوم بإضافة الحروف المفقودة والمستوطنين:


 php bin/console make:entity --regenerate App\\Entity\\ModxUsers 

يرجى ملاحظة أنني أضفت مجموعة "السمات" إلى التعليق التوضيحي @ApiResource


صور


أفتح رمز الفئة App \ Entity \ ModxUserAttributes ، أضف الشرح @ApiResource والاتصال مع الفئة App\Entity\ModxUsers :


 /** * @var ModxUsers * * @ORM\OneToOne(targetEntity="ModxUsers", mappedBy="attributes") * @ORM\JoinColumn(name="internalKey", referencedColumnName="id") */ private $user; 

بالنسبة لجميع الخصائص التي تحتاج إلى إضافتها إلى التحديد ، أدرج التعليق التوضيحي @Groups({"attributes"}) .


صور


النتيجة:


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


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

Source: https://habr.com/ru/post/ar479168/


All Articles