Cara membuat RESTful API on Symfony 5 + API Platform untuk proyek MODX


Dari pelajaran ini Anda akan belajar cara membuat API RESTful dengan cepat untuk situs apa pun di CMS apa pun, MODX hanyalah sebuah contoh.


Untuk membuat API, saya akan menggunakan:



Hasilnya ada di sini:
https://github.com/andchir/modx2-api


Saya melakukan semua yang dijelaskan di Linux, tetapi saya pikir pada Windows perbedaan dalam perintah tidak akan besar. Saya sudah menginstal Composer dan utilitas Symfony .


Membuat proyek dan kelas pengguna


Saya membuat proyek:


composer create-project symfony/skeleton modx2-api 

Instal paket yang diperlukan untuk membuat API:


 cd modx2-api composer req api composer req migrations composer req form composer req maker --dev 

Saya memulai server lokal.
Jika utilitas Symfony diinstal:


 symfony server:start 

atau lebih:


 php -S 127.0.0.1:8000 -t public 

Saya membuka alamat di browser untuk memverifikasi bahwa semuanya berfungsi:
http://127.0.0.1:8000/


Saya membuka file .env dan mengedit string koneksi ke database proyek di MODX :


 DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name 

Sekarang Anda perlu membuat pengguna dan mengkonfigurasi sistem otorisasi dengan login dan kata sandi.


Instal paket tambahan:


 composer req jwt-auth composer req orm-fixtures --dev composer req profiler --dev 

Opsi paket .jvt-otentikasi-bundel baru telah muncul di file .env .


Saya membuat kelas entitas dan repositori (Doktrin ORM) dari pengguna:


 php bin/console make:user 

Dua file muncul:


 src/Entity/User.php src/Repository/UserRepository.php 

Saya membuat tabel "pengguna" dalam database:


 bin/console doctrine:schema:create 

Saya mengkonfigurasi otorisasi pengguna sesuai dengan instruksi:



App Kode Pengontrol \ 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 ]); } } 

Saya menghasilkan kelas untuk membuat pengguna:


 php bin/console make:fixtures 

Lebih detail di sini: https://symfony.com/doc/current/security.html#a-create-your-user-class


Aplikasi Kode Kelas \ 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(); } } 

Saya membuat administrator dengan alamat email "admin@admin.com" dan kata sandi "admin" :


 php bin/console doctrine:fixtures:load --append --group=UserFixtures 

Nantinya data ini bisa diubah.


Saya menghasilkan kunci di folder config / jwt / :


 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 

Memeriksa pembuatan token:


 curl -X POST -H "Content-Type: application/json" http://localhost:8000/authentication_token -d '{"email":"admin@admin.com","password":"admin"}' 

Saya membuat migrasi:


 php bin/console make:migration 

Sekarang bagian yang menyenangkan.


API dan pembuatan dokumentasi


Saya menghasilkan kelas entitas untuk semua tabel database:


 php bin/console doctrine:mapping:import "App\Entity" annotation --path=src/Entity 


Saya menghasilkan getter dan setter untuk kelas:


 php bin/console make:entity --regenerate App 

Saya membuka kode satu kelas, misalnya src / Entity / ModxSiteContent.php . Tambahkan anotasi @ApiResource :


API untuk ModxSiteContent sudah siap.


Saya membuka halaman http: // localhost: 8000 / api



Saya ambil token, klik tombol "Otorisasi", masukkan baris dengan token:


 Bearer MY_TOKEN 


Saya klik tombol "Cobalah" dan kemudian tombol "Jalankan" . Saya mendapatkan hasil ini:


Hubungan tabel


Saya tidak akan menjelaskan bagaimana filter dibuat agar tidak menduplikasi dokumentasi , tetapi saya akan memberikan contoh bagaimana Anda bisa membuat hubungan untuk tabel, karena ini sedikit rumit.


Dalam kasus MODX, data pengguna disimpan dalam tabel terpisah "user_attributes" . Misalnya, saya perlu menambahkan email, nama, nomor telepon, dll ke sampel pengguna dengan permintaan GET. Saya membuka kode kelas App \ Entity \ ModxUsers , menambahkan $attributes properti pribadi dan menggambarkan koneksi dengan App kelas \ Entity \ ModxUserAttributes dalam anotasi "@ORM \ OneToOne":


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

Sekali lagi saya menambahkan getter dan setter yang hilang:


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

Harap dicatat bahwa saya menambahkan grup "atribut" ke anotasi @ApiResource


Gambar


Saya membuka kode App \ Entity \ ModxUserAttributes kelas , tambahkan anotasi @ApiResource dan koneksi dengan kelas App\Entity\ModxUsers :


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

Untuk semua properti yang perlu ditambahkan ke seleksi, saya menyisipkan @Groups({"attributes"}) anotasi @Groups({"attributes"}) .


Gambar


Hasil:


Akibatnya, untuk otorisasi dalam aplikasi Anda, pertama-tama Anda harus mengirim login (email) dan kata sandi ke URL "/ authentication_token" , dapatkan token dan kemudian kirim token ini dalam setiap permintaan di header "Otorisasi" :


Jika proyek https://github.com/andchir/modx2-api menarik bagi pengguna, itu akan berkembang. Saya juga menunggu PR dari semua orang yang ingin membantu.

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


All Articles