
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 { 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'
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":
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
Saya membuka kode App \ Entity \ ModxUserAttributes kelas , tambahkan anotasi @ApiResource
dan koneksi dengan kelas App\Entity\ModxUsers
:
private $user;
Untuk semua properti yang perlu ditambahkan ke seleksi, saya menyisipkan @Groups({"attributes"})
anotasi @Groups({"attributes"})
.
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.