सिम्फनी 4 पर सोनाटा एडमिन को स्थापित और कॉन्फ़िगर करें


सभी का अभिवादन। यह लेख सिम्फनी 4 और सोनाटा एडमिन के बारे में बात करेगा।


स्थापना प्रक्रिया के दौरान, मुझे दस्तावेज़ीकरण में बहुत अधिक अशुद्धियों का सामना करना पड़ा और स्वयं प्रलेखन कई स्थानों पर बिखर गया। यहां मैं पूरी प्रक्रिया पर विचार करूंगा, परियोजना के निर्माण से प्रमाणीकरण के साथ प्राधिकरण तक।


सेटिंग्स के कुछ हिस्सों को आधिकारिक दस्तावेज से लिया गया था, कुछ गिटहब पर टिप्पणियों से लिया गया था, जहां स्थापना समस्याओं पर चर्चा की गई थी। संभावित नुकसान और उनके आसपास के रास्ते भी चित्रित किए गए हैं।


सिम्फनी प्रोजेक्ट बनाना


$ composer create-project symfony/skeleton sonatademo 

 $ cd sonatademo 

सिम्फनी एंबेडेड वेब सर्वर का उपयोग करने के लिए, आपको सिम्फनी क्लाइंट स्थापित करना होगा।


हम शुरू करते हैं।


 $ symfony serve 

हम http://127.0.0.1:8000/ लिंक का अनुसरण करते हैं और हम मानक सिम्फनी अभिवादन प्राप्त करेंगे। तो सब कुछ सही ढंग से काम करता है।



सोनाटा व्यवस्थापक स्थापित करें


 $ composer require sonata-project/admin-bundle 

सोनाटा एडमिन और डी.बी.


डेटाबेस के साथ बातचीत करने के लिए, आपको तीन पुस्तकालयों में से एक को स्थापित करने की आवश्यकता है:



इस लेख में मैं SonataDoctrineORMAdminBundle का उपयोग कर रहा SonataDoctrineORMAdminBundle , जो MySQL या Sqlite साथ काम करने के लिए पर्याप्त है।


SonataDoctrineORMAdminBundle स्थापित करें।


 $ composer require sonata-project/doctrine-orm-admin-bundle 

अब Sqlite साथ काम को कॉन्फ़िगर करते हैं।


.Env फ़ाइल खोलें और अनुभाग में ###> doctrine/doctrine-bundle ### परिवर्तन DATABASE_URL


 DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db" 

चूंकि सिम्फनी फ्लेक्स स्थापना के दौरान हमारे लिए लगभग सभी काम करता है, इसलिए अंतिम परिणाम प्राप्त करने के लिए कुछ हेरफेर करने के लिए रहता है।


 # config/packages/framework.yaml framework: translator: { fallbacks: ['en'] } 

हम बाहर ले जाते हैं


 $ composer dump-env dev 

अब हम http://127.0.0.1:8000/admin लिंक का अनुसरण करते हैं और हम एक खाली मानक प्रशासनिक इंटरफ़ेस देखते हैं।



इकाई निर्माण


उदाहरण के लिए, एक-से-कई संबंधों से जुड़ी दो संस्थाएँ बनाते हैं।


 <?php // src/Entity/City.php namespace App\Entity; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class City { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer", options={"unsigned":true}) */ private $id; /** * @var string * * @ORM\Column(type="string") */ private $title; /** * @var string * * @ORM\Column(type="text") */ private $description; /** * @var bool * * @ORM\Column(type="boolean") */ private $isBig = false; /** * @ORM\OneToMany(targetEntity="Address", mappedBy="city") */ private $addresses; public function __construct() { $this->addresses = new ArrayCollection(); } public function getAddresses() { return $this->addresses; } /** * @return string */ public function getTitle(): ?string { return $this->title; } /** * @param string $title * @return City */ public function setTitle(string $title): City { $this->title = $title; return $this; } /** * @return string */ public function getDescription(): ?string { return $this->description; } /** * @param string $description * @return City */ public function setDescription(string $description): City { $this->description = $description; return $this; } /** * @return bool */ public function isBig(): ?bool { return $this->isBig; } /** * @param bool $isBig * @return City */ public function setIsBig(bool $isBig): City { $this->isBig = $isBig; return $this; } public function __toString() { return $this->title; } } 

 <?php // src/Entity/Address.php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity */ class Address { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer", options={"unsigned":true}) */ private $id; /** * @var string * * @ORM\Column(type="string") */ private $title; /** * @var string * * @ORM\Column(type="text") */ private $description; /** * @ORM\ManyToOne(targetEntity="City", inversedBy="addresses") */ private $city; /** * @return string */ public function getTitle(): ?string { return $this->title; } /** * @param string $title * @return Address */ public function setTitle(string $title): Address { $this->title = $title; return $this; } /** * @return string */ public function getDescription(): ?string { return $this->description; } /** * @param string $description * @return Address */ public function setDescription(string $description): Address { $this->description = $description; return $this; } /** * @return City */ public function getCity(): ?City { return $this->city; } /** * @param City $city * @return Address */ public function setCity(City $city) { $this->city = $city; return $this; } public function __toString() { return $this->title; } } 

हम डेटाबेस के साथ सिंक्रनाइज़ करते हैं।


 bin/console doctrine:schema:create 

सोनाटा एडमिन के लिए इकाई विन्यास


प्रत्येक इकाई के लिए यह आवश्यक है कि वह सोनाटा एडमिन के काम करने के तरीके के विवरण के साथ एक अलग फाइल बनाए।


 <?php // src/Admin/CityAdmin.php namespace App\Admin; use App\Entity\Address; use App\Entity\City; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Form\Type\CollectionType; use Sonata\AdminBundle\Form\Type\ModelType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; final class CityAdmin extends AbstractAdmin { protected function configureFormFields(FormMapper $formMapper) { $formMapper->add('title', TextType::class); $formMapper->add('description', TextareaType::class); $formMapper->add('isBig', CheckboxType::class); } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper->add('title'); $datagridMapper->add('isBig'); } protected function configureListFields(ListMapper $listMapper) { $listMapper->addIdentifier('title'); $listMapper->addIdentifier('isBig'); } } 

 <?php // src/Admin/AddressAdmin.php namespace App\Admin; use App\Entity\City; use Sonata\AdminBundle\Admin\AbstractAdmin; use Sonata\AdminBundle\Datagrid\ListMapper; use Sonata\AdminBundle\Datagrid\DatagridMapper; use Sonata\AdminBundle\Form\FormMapper; use Sonata\AdminBundle\Form\Type\ModelType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; final class AddressAdmin extends AbstractAdmin { protected function configureFormFields(FormMapper $formMapper) { $formMapper->add('title', TextType::class); $formMapper->add('description', TextareaType::class); $formMapper->add('city', ModelType::class, [ 'class' => City::class, 'property' => 'title', ]); } protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper->add('title'); } protected function configureListFields(ListMapper $listMapper) { $listMapper->addIdentifier('title'); } } 

इन वर्गों को service.yaml में वर्णित किया जाना चाहिए।


 # config/service.yaml services: ... App\Admin\CityAdmin: arguments: [~, App\Entity\City, ~] tags: - { name: sonata.admin, manager_type: orm, label: City } App\Admin\AddressAdmin: arguments: [~, App\Entity\Address, ~] tags: - { name: sonata.admin, manager_type: orm, label: Address } 

यदि प्रशासनिक भाग में प्रवेश करते समय त्रुटियां होती हैं, उदाहरण Unable to generate a URL for the named route , तो आपको एप्लिकेशन कैश को साफ़ करने और फिर से प्रयास करने की आवश्यकता है।


 bin/console cache:clear 

अब, यदि आप लिंक http://127.0.0.1:8000/admin पर क्लिक करते हैं, तो हम दो तत्वों की एक सूची देखेंगे Address और City , जहां आप सूची देख सकते हैं और नई इकाइयां बना सकते हैं।



प्राधिकरण और प्रमाणीकरण


सबसे पहले, एक उपयोगकर्ता इकाई बनाएं।


 <?php // src/Entity/User.php namespace App\Entity; use Sonata\UserBundle\Entity\BaseUser as BaseUser; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="fos_user") */ class User extends BaseUser { /** * @ORM\Id * @ORM\Column(type="integer", options={"unsigned":true}) * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @return int */ public function getId() { return $this->id; } } 

और उसी समय उपयोगकर्ता समूह का सार बनाएं।


 <?php // src/Entity/Group.php namespace App\Entity; use Sonata\UserBundle\Entity\BaseGroup as BaseGroup; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="fos_group") */ class Group extends BaseGroup { /** * @ORM\Id * @ORM\Column(type="integer", options={"unsigned":true}) * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @return int */ public function getId() { return $this->id; } } 

बाद हम Twig को एक टेम्पलेट इंजन के रूप में कॉन्फ़िगर करते हैं।


 framework: ... templating: engines: ['twig'] 

वर्तमान में सिम्फनी फ्लेक्स और FOSUserBundle के साथ समस्याएं हैं। अधिक जानकारी के लिए, लिंक # 2562 , # 2708 और # 2801 देखें


हालांकि इन समस्याओं का समाधान नहीं किया जाता है, आपको Sonata User Bundle स्थापित करने से पहले कुछ अतिरिक्त जोड़तोड़ करने की आवश्यकता है।


 # config/service.yaml services: ... mailer: alias: fos_user.mailer.noop public: true 

 # config/packages/fos_user.yaml fos_user: db_driver: orm firewall_name: main user_class: App\Entity\User registration: confirmation: enabled: false from_email: address: '%env(MAILER_USER_ADDRESS)%' sender_name: '%env(MAILER_USER_NAME)%' service: user_manager: sonata.user.orm.user_manager mailer: 'fos_user.mailer.noop' group: group_class: App\Entity\Group group_manager: sonata.user.orm.group_manager 

जिसके बाद, आप बंडल को स्थापित कर सकते हैं।


 $ composer require sonata-project/user-bundle 

ACL सेटअप


सिम्फनी 4 में, ACL को एक अलग symfony/acl-bundle में स्थानांतरित किया गया। इसलिए, इसे अलग से स्थापित किया जाना चाहिए।


 composer require symfony/acl-bundle 

 # config/packages/sonata_user.yaml sonata_user: security_acl: true manager_type: orm 

 # config/packages/acl.yaml acl: connection: default 

सिद्धांत का विन्यास


 # config/packages/doctrine.yaml doctrine: orm: mappings: SonataUserBundle: ~ FOSUserBundle: ~ 

मेल के साथ काम सेट करना


चूंकि इस लेख के ढांचे के भीतर मेल के साथ काम पर विचार नहीं किया गया है, इसलिए हम वास्तविक सेवा के बजाय एक स्टब का संकेत देंगे।


 # config/packages/sonata_user.yaml sonata_user: mailer: fos_user.mailer.noop 

सोनाटा एडमिन में यूजर बंडल इंटीग्रेशन


 # config/routes.yaml sonata_user_admin_security: resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml' prefix: /admin sonata_user_admin_resetting: resource: '@SonataUserBundle/Resources/config/routing/admin_resetting.xml' prefix: /admin/resetting 

 # config/packages/security.yaml security: encoders: FOS\UserBundle\Model\UserInterface: sha512 providers: fos_userbundle: id: fos_user.user_provider.username role_hierarchy: ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN] ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false # -> custom firewall for the admin area of the URL admin: pattern: /admin(.*) context: user form_login: provider: fos_userbundle login_path: /admin/login use_forward: false check_path: /admin/login_check failure_path: null logout: path: /admin/logout target: /admin/login anonymous: true # -> end custom configuration # default login area for standard users # This firewall is used to handle the public login area # This part is handled by the FOS User Bundle main: pattern: .* context: user form_login: provider: fos_userbundle login_path: /login use_forward: false check_path: /login_check failure_path: null logout: true anonymous: true access_control: # Admin login page needs to be accessed without credential - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/login_check$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } # Secured part of the site # This config requires being logged for the whole site and having the admin role for the admin part. # Change these rules to adapt them to your needs - { path: ^/admin/, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] } - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY } 

 # config/packages/sonata_user.yaml sonata_user: ... class: user: App\Entity\User group: App\Entity\Group 

अब आप ACL और डेटाबेस को अपडेट कर सकते हैं।


 $ bin/console acl:init 

 $ php bin/console doctrine:schema:update --force 

एक सुपर उपयोगकर्ता बनाएँ। नाम demo और पासवर्ड demo निर्दिष्ट करें।


 $ bin/console fos:user:create --super-admin Please choose a username:demo Please choose an email:demo@demo.com Please choose a password: Created user demo 

एसीएल के साथ-साथ हमारे व्यवस्थापक वर्गों को सही ढंग से कॉन्फ़िगर करने के लिए, आपको सेटिंग्स में बदलाव करने की आवश्यकता है।


 sonata_admin: ... security: handler: sonata.admin.security.handler.acl 

निम्नलिखित चलाने के बाद:


 $ bin/console sonata:admin:setup-acl Starting ACL AdminBundle configuration > install ACL for App\Admin\AddressAdmin - add role: ROLE_APP\ADMIN\ADDRESSADMIN_GUEST, permissions: ["LIST"] - add role: ROLE_APP\ADMIN\ADDRESSADMIN_STAFF, permissions: ["LIST","CREATE"] - add role: ROLE_APP\ADMIN\ADDRESSADMIN_EDITOR, permissions: ["OPERATOR","EXPORT"] - add role: ROLE_APP\ADMIN\ADDRESSADMIN_ADMIN, permissions: ["MASTER"] > install ACL for App\Admin\CityAdmin - add role: ROLE_APP\ADMIN\CITYADMIN_GUEST, permissions: ["LIST"] - add role: ROLE_APP\ADMIN\CITYADMIN_STAFF, permissions: ["LIST","CREATE"] - add role: ROLE_APP\ADMIN\CITYADMIN_EDITOR, permissions: ["OPERATOR","EXPORT"] - add role: ROLE_APP\ADMIN\CITYADMIN_ADMIN, permissions: ["MASTER"] > install ACL for sonata.user.admin.user - add role: ROLE_SONATA_USER_ADMIN_USER_GUEST, permissions: ["LIST"] - add role: ROLE_SONATA_USER_ADMIN_USER_STAFF, permissions: ["LIST","CREATE"] - add role: ROLE_SONATA_USER_ADMIN_USER_EDITOR, permissions: ["OPERATOR","EXPORT"] - add role: ROLE_SONATA_USER_ADMIN_USER_ADMIN, permissions: ["MASTER"] > install ACL for sonata.user.admin.group - add role: ROLE_SONATA_USER_ADMIN_GROUP_GUEST, permissions: ["LIST"] - add role: ROLE_SONATA_USER_ADMIN_GROUP_STAFF, permissions: ["LIST","CREATE"] - add role: ROLE_SONATA_USER_ADMIN_GROUP_EDITOR, permissions: ["OPERATOR","EXPORT"] - add role: ROLE_SONATA_USER_ADMIN_GROUP_ADMIN, permissions: ["MASTER"] 

अब, जब आप http://127.0.0.1:8000/admin पते पर जाने का प्रयास करते हैं , तो हम http://127.0.0.1:8000/admin/login पर पुनर्निर्देशित हो जाएंगे।



डेमो / डेमो दर्ज करें और प्रशासनिक भाग में प्राप्त करें।



परिणाम


सभी जोड़तोड़ के बाद, हमें सोनाटा उपयोगकर्ता + एसीएल का उपयोग करके प्रमाणीकरण और प्राधिकरण के साथ सिम्फनी 4 पर सोनाटा एडमिन का एक प्रशासनिक हिस्सा मिला।


आप सभी का धन्यवाद। यदि आपके पास प्रश्न और टिप्पणियां हैं, तो मैं उन्हें टिप्पणियों में सुनूंगा।

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


All Articles