
рдЗрд╕ рдкрд╛рда рд╕реЗ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕реА рднреА 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 { 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'
рдореИрдВ рдИрдореЗрд▓ рдкрддрд╛ "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 рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ:
private $attributes;
рдлрд┐рд░ рд╕реЗ рдореИрдВ рд▓рд╛рдкрддрд╛ рдЧреЗрдЯрд░реНрд╕ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рдмрд╕рддрд╛ рд╣реВрдВ:
php bin/console make:entity --regenerate App\\Entity\\ModxUsers
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ @ApiResource
рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ "рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ" рд╕рдореВрд╣ рдЬреЛрдбрд╝рд╛ рд╣реИ
рдореИрдВ рдХрдХреНрд╖рд╛ рдХрд╛ рдХреЛрдб рдЦреЛрд▓рддрд╛ рд╣реВрдВ App \ Entity \ ModxUserAttributes , annotation @ApiResource
рдФрд░ рд╡рд░реНрдЧ App\Entity\ModxUsers
рд╕рд╛рде рдХрдиреЗрдХреНрд╢рди App\Entity\ModxUsers
:
private $user;
рдЙрди рд╕рднреА рдЧреБрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдиреНрд╣реЗрдВ рдЪрдпрди рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ рдПрдиреЛрдЯреЗрд╢рди @Groups({"attributes"})
рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред
рдкрд░рд┐рдгрд╛рдо:

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

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