Преглед на файлове

Configures EasyAdmin for core entities

Sets up EasyAdmin to manage games, universe entities (galaxies, sectors, systems, planets), and accounts (users, players).

This includes:
- Adding CRUD controllers for each entity.
- Configuring menu items in the dashboard.
- Setting the default dashboard route to the Games CRUD index.
- Adds intl extension for date formatting.
olinox14 преди 2 месеца
родител
ревизия
a29aae32b3

+ 14 - 2
api/src/Controller/Admin/DashboardController.php

@@ -13,7 +13,10 @@ class DashboardController extends AbstractDashboardController
 {
     public function index(): Response
     {
-        return parent::index();
+        // Redirect to Games CRUD index by default
+        $adminUrlGenerator = $this->container->get(\EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator::class);
+        $url = $adminUrlGenerator->setController(\App\Controller\Admin\GameCrudController::class)->generateUrl();
+        return $this->redirect($url);
 
         // Option 1. You can make your dashboard redirect to some common page of your backend
         //
@@ -45,6 +48,15 @@ class DashboardController extends AbstractDashboardController
     public function configureMenuItems(): iterable
     {
         yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
-        // yield MenuItem::linkToCrud('The Label', 'fas fa-list', EntityClass::class);
+        yield MenuItem::section('Game Management');
+        yield MenuItem::linkToCrud('Games', 'fas fa-gamepad', \App\Entity\Game::class);
+        yield MenuItem::section('Universe');
+        yield MenuItem::linkToCrud('Galaxies', 'fas fa-galactic-republic', \App\Entity\Galaxy::class);
+        yield MenuItem::linkToCrud('Sectors', 'fas fa-project-diagram', \App\Entity\Sector::class);
+        yield MenuItem::linkToCrud('Systems', 'fas fa-sun', \App\Entity\System::class);
+        yield MenuItem::linkToCrud('Planets', 'fas fa-globe', \App\Entity\Planet::class);
+        yield MenuItem::section('Accounts');
+        yield MenuItem::linkToCrud('Users', 'fas fa-user', \App\Entity\User::class);
+        yield MenuItem::linkToCrud('Players', 'fas fa-users', \App\Entity\Player::class);
     }
 }

+ 24 - 0
api/src/Controller/Admin/GalaxyCrudController.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use App\Entity\Galaxy;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
+
+class GalaxyCrudController extends AbstractCrudController
+{
+    public static function getEntityFqcn(): string
+    {
+        return Galaxy::class;
+    }
+
+    public function configureFields(string $pageName): iterable
+    {
+        return [
+            IdField::new('id')->onlyOnIndex(),
+            TextField::new('name'),
+        ];
+    }
+}

+ 42 - 0
api/src/Controller/Admin/GameCrudController.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use App\Entity\Game;
+use App\Enum\GameStatusEnum;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
+use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
+
+class GameCrudController extends AbstractCrudController
+{
+    public static function getEntityFqcn(): string
+    {
+        return Game::class;
+    }
+
+    public function configureFields(string $pageName): iterable
+    {
+        return [
+            IdField::new('id')->onlyOnIndex(),
+            TextField::new('name'),
+            ChoiceField::new('status')->setChoices($this->enumChoices(GameStatusEnum::class))->renderAsBadges(),
+            DateTimeField::new('openedAt')->setFormTypeOptions(['html5' => true, 'widget' => 'single_text'])->hideOnIndex(),
+        ];
+    }
+
+    /**
+     * @param class-string $enumClass
+     * @return array<string, string>
+     */
+    private function enumChoices(string $enumClass): array
+    {
+        $choices = [];
+        foreach ($enumClass::cases() as $case) {
+            $choices[$case->name] = $case;
+        }
+        return $choices;
+    }
+}

+ 44 - 0
api/src/Controller/Admin/PlanetCrudController.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use App\Entity\Planet;
+use App\Enum\CelestialBodySizeEnum;
+use App\Enum\PlanetTypeEnum;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
+use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
+
+class PlanetCrudController extends AbstractCrudController
+{
+    public static function getEntityFqcn(): string
+    {
+        return Planet::class;
+    }
+
+    public function configureFields(string $pageName): iterable
+    {
+        return [
+            IdField::new('id')->onlyOnIndex(),
+            TextField::new('name'),
+            ChoiceField::new('type')->setChoices($this->enumChoices(PlanetTypeEnum::class))->renderAsBadges(),
+            IntegerField::new('position'),
+            ChoiceField::new('size')->setChoices($this->enumChoices(CelestialBodySizeEnum::class))->renderAsBadges(),
+        ];
+    }
+
+    /**
+     * @param class-string $enumClass
+     * @return array<string, string>
+     */
+    private function enumChoices(string $enumClass): array
+    {
+        $choices = [];
+        foreach ($enumClass::cases() as $case) {
+            $choices[$case->name] = $case;
+        }
+        return $choices;
+    }
+}

+ 50 - 0
api/src/Controller/Admin/PlayerCrudController.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use App\Entity\Player;
+use App\Enum\CareerEnum;
+use App\Enum\PlayerStatusEnum;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
+use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
+
+class PlayerCrudController extends AbstractCrudController
+{
+    public static function getEntityFqcn(): string
+    {
+        return Player::class;
+    }
+
+    public function configureFields(string $pageName): iterable
+    {
+        return [
+            IdField::new('id')->onlyOnIndex(),
+            AssociationField::new('user'),
+            AssociationField::new('game'),
+            TextField::new('name'),
+            ChoiceField::new('career')->setChoices($this->enumChoices(CareerEnum::class))->renderAsBadges(),
+            DateTimeField::new('joinedAt')->setFormTypeOptions(['html5' => true, 'widget' => 'single_text'])->hideOnIndex(),
+            ChoiceField::new('status')->setChoices($this->enumChoices(PlayerStatusEnum::class))->renderAsBadges(),
+            IntegerField::new('score')->hideOnIndex(),
+            DateTimeField::new('lastPlayedAt')->setFormTypeOptions(['html5' => true, 'widget' => 'single_text'])->hideOnIndex(),
+        ];
+    }
+
+    /**
+     * @param class-string $enumClass
+     * @return array<string, string>
+     */
+    private function enumChoices(string $enumClass): array
+    {
+        $choices = [];
+        foreach ($enumClass::cases() as $case) {
+            $choices[$case->name] = $case;
+        }
+        return $choices;
+    }
+}

+ 43 - 0
api/src/Controller/Admin/SectorCrudController.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use App\Entity\Sector;
+use App\Enum\SectorStatusEnum;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
+use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
+
+class SectorCrudController extends AbstractCrudController
+{
+    public static function getEntityFqcn(): string
+    {
+        return Sector::class;
+    }
+
+    public function configureFields(string $pageName): iterable
+    {
+        return [
+            IdField::new('id')->onlyOnIndex(),
+            TextField::new('name'),
+            ChoiceField::new('status')
+                ->setChoices($this->enumChoices(SectorStatusEnum::class))
+                ->renderExpanded(false)
+                ->renderAsBadges(),
+        ];
+    }
+
+    /**
+     * @param class-string $enumClass
+     * @return array<string, string>
+     */
+    private function enumChoices(string $enumClass): array
+    {
+        $choices = [];
+        foreach ($enumClass::cases() as $case) {
+            $choices[$case->name] = $case;
+        }
+        return $choices;
+    }
+}

+ 44 - 0
api/src/Controller/Admin/SystemCrudController.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use App\Entity\System;
+use App\Enum\CelestialBodySizeEnum;
+use App\Enum\StarTypeEnum;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
+use EasyCorp\Bundle\EasyAdminBundle\Field\ChoiceField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
+
+class SystemCrudController extends AbstractCrudController
+{
+    public static function getEntityFqcn(): string
+    {
+        return System::class;
+    }
+
+    public function configureFields(string $pageName): iterable
+    {
+        return [
+            IdField::new('id')->onlyOnIndex(),
+            TextField::new('name'),
+            ChoiceField::new('starType')->setChoices($this->enumChoices(StarTypeEnum::class))->renderAsBadges(),
+            ChoiceField::new('starSize')->setChoices($this->enumChoices(CelestialBodySizeEnum::class))->renderAsBadges(),
+            IntegerField::new('asteroidBeltPosition'),
+        ];
+    }
+
+    /**
+     * @param class-string $enumClass
+     * @return array<string, string>
+     */
+    private function enumChoices(string $enumClass): array
+    {
+        $choices = [];
+        foreach ($enumClass::cases() as $case) {
+            $choices[$case->name] = $case;
+        }
+        return $choices;
+    }
+}

+ 27 - 0
api/src/Controller/Admin/UserCrudController.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Controller\Admin;
+
+use App\Entity\User;
+use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
+use EasyCorp\Bundle\EasyAdminBundle\Field\EmailField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
+use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
+
+class UserCrudController extends AbstractCrudController
+{
+    public static function getEntityFqcn(): string
+    {
+        return User::class;
+    }
+
+    public function configureFields(string $pageName): iterable
+    {
+        return [
+            IdField::new('id')->onlyOnIndex(),
+            TextField::new('username'),
+            EmailField::new('email'),
+            TextField::new('password')->hideOnIndex(),
+        ];
+    }
+}

+ 2 - 2
api/src/Entity/Player.php

@@ -111,12 +111,12 @@ class Player
         return $this;
     }
 
-    public function getStatus(): string
+    public function getStatus(): PlayerStatusEnum
     {
         return $this->status;
     }
 
-    public function setStatus(string $status): self
+    public function setStatus(PlayerStatusEnum $status): self
     {
         $this->status = $status;
         return $this;

+ 3 - 2
docker/api/Dockerfile

@@ -1,11 +1,12 @@
 FROM php:8.2.27-apache
 
 RUN apt-get update && apt-get install -y --fix-missing \
-    apt-utils build-essential xorg wget bash gnupg zip nano git;
+    apt-utils build-essential xorg wget bash gnupg zip nano git libicu-dev;
 
 COPY /docker/api/vhost.conf /etc/apache2/sites-available/vhost.conf
 
-RUN docker-php-ext-install pdo pdo_mysql
+RUN docker-php-ext-configure intl \
+    && docker-php-ext-install pdo pdo_mysql intl
 
 RUN a2ensite vhost.conf; \
     a2enmod rewrite; \