MODX рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП Symfony 5 + API рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдПрдХ RESTful API рдХреИрд╕реЗ рдмрдирд╛рдПрдВ


рдЗрд╕ рдкрд╛рда рд╕реЗ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕реА рднреА CMS рдкрд░ рдХрд┐рд╕реА рднреА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ RESTful API рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, MODX рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред


рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:



рдкрд░рд┐рдгрд╛рдо рдпрд╣рд╛рдБ рд╣реИ:
https://github.com/andchir/modx2-api


рдореИрдВрдиреЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдХрдорд╛рдВрдб рдореЗрдВ рдЕрдВрддрд░ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рд╕рдВрдЧреАрддрдХрд╛рд░ рдФрд░ рд╕рд┐рдореНрдлрдиреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдкреВрд░реНрд╡-рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред


рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛


рдореИрдВ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ:


composer create-project symfony/skeleton modx2-api 

рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:


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

рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред
рдпрджрд┐ рд╕рд┐рдореНрдлрдиреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ:


 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- рдкреНрд░рдорд╛рдгреАрдХрд░рдг-рдмрдВрдбрд▓ рдкреИрдХреЗрдЬ рд╡рд┐рдХрд▓реНрдк .env рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред


рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЗрдХрд╛рдИ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрдХреНрд╖рд╛рдПрдВ (рдбреЙрдХреНрдЯреНрд░рд┐рди рдУрдЖрд░рдПрдо) рдмрдирд╛рддрд╛ рд╣реВрдВ:


 php bin/console make:user 

рджреЛ рдлрд╛рдЗрд▓реЗрдВ рджрд┐рдЦрд╛рдИ рджреАрдВ:


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

рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ "рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛" рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ:


 bin/console doctrine:schema:create 

рдореИрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реВрдВ:



рдирд┐рдпрдВрддреНрд░рдХ рдХреЛрдб App \ рдирд┐рдпрдВрддреНрд░рдХ \ 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


рдХреНрд▓рд╛рд╕ рдХреЛрдб App \ 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" рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб "рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ" рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдмрдирд╛рддрд╛ рд╣реВрдВ:


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

рдмрд╛рдж рдореЗрдВ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдореИрдВ 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 

рдЯреЛрдХрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЬрд╛рдБрдЪ:


 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 

рдЕрдм рдордЬрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред


рдПрдкреАрдЖрдИ рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдкреАрдврд╝реА


рдореИрдВ рд╕рднреА рдбреЗрдЯрд╛рдмреЗрд╕ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ рд╡рд░реНрдЧ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реВрдВ:


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


рдореИрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ:


 php bin/console make:entity --regenerate App 

рдореИрдВ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдХреЛрдб рдЦреЛрд▓рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП src / Entity / ModxSiteContent.php ред @ApiResource рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВ:


ModxSiteContent рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рддреИрдпрд╛рд░ рд╣реИред


рдореИрдВ http: // localhost: 8000 / api рдкреЗрдЬ рдЦреЛрд▓рддрд╛ рд╣реВрдВ



рдореИрдВ рдЯреЛрдХрди рд▓реЗрддрд╛ рд╣реВрдВ, "рдЕрдзрд┐рдХреГрдд рдХрд░реЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдЯреЛрдХрди рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдбрд╛рд▓реЗрдВ:


 Bearer MY_TOKEN 


рдореИрдВ "рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░ "рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ" рдмрдЯрдиред рдореБрдЭреЗ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рддрд╛ рд╣реИ:


рдЯреЗрдмрд▓ рд╕рдВрдмрдВрдз


рдореИрдВ рдпрд╣ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рди рд╣реЛ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдз рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реИред


MODX рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рддрд╛рд▓рд┐рдХрд╛ "user_attributes" рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ GET рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдирдореВрдиреЗ рдореЗрдВ рдЙрдирдХреЗ рдИрдореЗрд▓, рдирд╛рдо, рдлреЛрди рдирдВрдмрд░ рдЖрджрд┐ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдХреНрд▓рд╛рд╕ рдХреЛрдб App \ Entity \ ModxUsers рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реВрдВ , рдирд┐рдЬреА рд╕рдВрдкрддреНрддрд┐ $attributes рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рдПрдиреЛрдЯреЗрд╢рди "@ORM \ OneToOne" рдореЗрдВ рд╡рд░реНрдЧ App \ Entity \ ModxUserAttributes рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ:


 /** * @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 , annotation @ApiResource рдФрд░ рд╡рд░реНрдЧ App\Entity\ModxUsers рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди App\Entity\ModxUsers :


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

рдЙрди рд╕рднреА рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЪрдпрди рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ рдПрдиреЛрдЯреЗрд╢рди @Groups({"attributes"}) рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред


рдЪрд┐рддреНрд░


рдкрд░рд┐рдгрд╛рдо:


рдирддреАрдЬрддрди, рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ URL "/ рдкреНрд░рдорд╛рдгреАрдХрд░рдг_рдЯреЛрдХрди" рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЙрдЧрд┐рди (рдИрдореЗрд▓) рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛, рдПрдХ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд┐рд░ "рдкреНрд░рд╛рдзрд┐рдХрд░рдг" рд╢реАрд░реНрд╖рдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдпрд╣ рдЯреЛрдХрди рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛:


рдпрджрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ https://github.com/andchir/modx2-api рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдЧреАред рдореИрдВ рдЙрди рд╕рднреА рд▓реЛрдЧреЛрдВ рд╕реЗ рдкреАрдЖрд░ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ рдорджрдж рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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


All Articles