گام 9: راه‌اندازی پشت صحنه‌ی مدیریتی

5.0 version
Maintained

راه‌اندازی پشت صحنه‌ی مدیریتی

وظیفه مدیران پروژه، افزودن کنفرانس‌های آینده به پایگاه‌داده است. پشت صحنه‌ی مدیریتی، یک قسمت محافظت‌شده در وبسایت است که مدیران پروژه می‌توانند داده‌های وبسایت را مدیریت کرده، ارسال بازخوردها را تعدیل نموده و وظایفِ متعدد دیگری را انجام دهند.

چگونه می‌توانیم این بخش را به سرعت ایجاد کنیم؟ به کمک یک باندل که قادر به تولید پشت صحنه‌ی مدیریتی بر اساس مدل پروژه است. باندل EasyAdmin کاملاً برای این کار مناسب می باشد.

پیکربندی EasyAdmin

ابتدا EasyAdmin را به عنوان وابستگی به پروژه اضافه نمایید:

1
$ symfony composer req "admin:^2.0"

برای پیکربندی EasyAdmin، یک فایل پیکربندی جدید توسط سیمفونی Flex (بر اساس recipe مربوط به باندل) تولید شده است:

config/packages/easy_admin.yaml
1
2
3
4
5
6
#easy_admin:
#    entities:
#        # List the entity class name you want to manage
#        - App\Entity\Product
#        - App\Entity\Category
#        - App\Entity\User

تقریباً تمام بسته‌ها مانند این بسته، دارای یک فایل پیکربندی در پوشه‌ی config/packages/ هستند. اکثر اوقات، پیشفرض‌ها با دقت زیاد و به نحوی انتخاب شده‌اند که برای بیشتر اپلیکیشن‌ها کار کنند.

قسمت اول خطوط را از حالت کامنت خارج کرده و کلاس‌های مدل پروژه را به آن بیافزایید:

config/packages/easy_admin.yaml
1
2
3
4
easy_admin:
    entities:
        - App\Entity\Conference
        - App\Entity\Comment

وارد پشت صحنه‌ی مدیریتی ایجادشده که در آدرس /admin قرار دارد، بشوید. واو! یک رابط کاربری زیبا و پرامکانات برای کنفرانس‌ها و کامنت‌ها:

نکته

چرا پشت صحنه‌ی مدیریتی از مسیر /admin قابل دستیابی می‌باشد؟ این پیشوند پیشفرض است که در پوشه config/routes/easy_admin.yaml پیکربندی شده است:

config/routes/easy_admin.yaml
1
2
3
4
easy_admin_bundle:
    resource: '@EasyAdminBundle/Controller/EasyAdminController.php'
    prefix: /admin
    type: annotation

شما می‌توانید آن را به هرمسیری که مایلید تغییر دهید.

البته افزودن کنفرانس‌ها و کامنت‌ها هنوز امکان‌پذیر نیست و با خطایی به این شکل مواجه خواهید شد: Object of class App\Entity\Conference could not be converted to string. باندل EasyAdmin تلاش می‌کند تا کنفرانس را به کامنت‌ها مرتبط سازد اما این کار تنها در صورتی امکان‌پذیر است که یک نمایش رشته‌ای (string representation) از کنفرانس موجود باشد. این مشکل را با افزودن متد __toString() به کلاس Conference رفع کنید:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
--- a/src/Entity/Conference.php
+++ b/src/Entity/Conference.php
@@ -43,6 +43,11 @@ class Conference
         $this->comments = new ArrayCollection();
     }

+    public function __toString(): string
+    {
+        return $this->city.' '.$this->year;
+    }
+
     public function getId(): ?int
     {
         return $this->id;

همین کار را برای کلاس Comment انجام دهید:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -48,6 +48,11 @@ class Comment
      */
     private $photoFilename;

+    public function __toString(): string
+    {
+        return (string) $this->getEmail();
+    }
+
     public function getId(): ?int
     {
         return $this->id;

شما اکنون از طریق پشت صحنه‌ی مدیریتی می توانید کنفرانس‌ها را به طور مستقیم اضافه کرده، تغییر داده و یا حذف نمایید. کمی با آن بازی کنید و حداقل یک کنفرانس اضافه نمایید.

تعدادی نظر بدون عکس اضافه کنید. فعلاً تاریخ را به صورت دستی تنظیم کنید؛ در گام بعدی، ستون createdAt را به صورت خودکار پر می‌کنیم.

شخصی‌سازی EasyAdmin

پشت صحنه‌ی مدیریتی پیشفرض به خوبی کار می‌کند، اما می‌تواند به راههای مختلفی شخصی‌سازی گردد تا تجربه‌ی بهتری را منتقل نماید. بیایید تعدادی تغییر ساده ایجاد کنیم تا امکانات موجود نشان داده شود. پیکربندی موجود را با این موارد جایگزین نمایید:

config/packages/easy_admin.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
easy_admin:
    site_name: Conference Guestbook

    design:
        menu:
            - { route: 'homepage', label: 'Back to the website', icon: 'home' }
            - { entity: 'Conference', label: 'Conferences', icon: 'map-marker' }
            - { entity: 'Comment', label: 'Comments', icon: 'comments' }

    entities:
        Conference:
            class: App\Entity\Conference

        Comment:
            class: App\Entity\Comment
            list:
                fields:
                    - author
                    - { property: 'email', type: 'email' }
                    - { property: 'createdAt', type: 'datetime' }
                sort: ['createdAt', 'ASC']
                filters: ['conference']
            edit:
                fields:
                    - { property: 'conference' }
                    - { property: 'createdAt', type: datetime, type_options: { attr: { readonly: true } } }
                    - 'author'
                    - { property: 'email', type: 'email' }
                    - text

ما بخش design را بازنویسی کردیم تا به گزینه‌های درون منو، آیکون و یک لینک بازگشت به صفحه‌ی اصلی اضافه شود.

برای بخش Comment، لیست کردن فیلدها به ما اجازه می‌دهد تا آن‌ها را به شکل دلخواه مرتب کنیم. تعدادی از فیلدها اصلاح شده‌اند، مثلاً تاریخ ایجاد (creation date) به صورت فقط-خواندنی (read-only) در آمده است. بخش filters، تعریف می‌کند که چه فیلترهایی باید در بالای یک فیلد جستجوی معمولی قرار گیرد.

این شخصی‌سازی‌ها تنها بخش کوچکی از امکاناتی که EasyAdmin در اختیار می‌گذارد را معرفی می‌کنند.

کمی با بخش مدیریت بازی کنید، کامنت‌ها را بر اساس کنفرانس فیلتر کنید، یا مثلاً کامنت‌ها را بر اساس رایانامه جستجو کنید. تنها مشکل این است که هر کسی می‌تواند به پشت صحنه مدیریتی دسترسی پیدا کند. نگران نباشید، ما در گام آتی آن را امن خواهیم نمود.

1
$ symfony run psql -c "TRUNCATE conference RESTART IDENTITY CASCADE"

  • « Previous گام 8: توصیف ساختار داده
  • Next » گام 10: ساخت رابط کاربری

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.