• Час читання ~3 хв
  • 16.03.2023

Нещодавно я зіткнувся з унікальним підходом до завантаження маршрутів в додатки Laravel, і хотів поділитися цим з вами. Це дозволяє створювати класи реєстраторів маршрутів, у межах яких ви реєструєте свої маршрути. Я побачив це в пакеті, який зараз розробляє Ollie Read, і він привернув мою увагу як чистий і захоплюючий спосіб реєстрації маршрутів.

Зміни, необхідні для вашого стандартного застосування Laravel, відносно прості. Вносимо кілька змін в Постачальника послуг маршруту - і видаляємо файли маршруту Web і API. Перше, що ми робимо, це створюємо нову рису / турботу, яку ми можемо додати до нашої app/Providers/RouteServiceProvider назви MapRouteRegistrars. Додайте наступний код до цієї нової риси/турботи.

declare(strict_types=1);

namespace App\Routing\Concerns;

use App\Routing\Contracts\RouteRegistrar;
use Illuminate\Contracts\Routing\Registrar;
use RuntimeException;

trait MapRouteRegistrars
{
    protected function mapRoutes(Registrar $router, array $registrars): void
    {
        foreach ($registrars as $registrar) {
            if (! class_exists($registrar) || ! is_subclass_of($registrar, RouteRegistrar::class)) {
                throw new RuntimeException(sprintf(
                    'Cannot map routes \'%s\', it is not a valid routes class',
                    $registrar
                ));
            }
            (new $registrar)->map($router);
        }
    }
}

Як бачите, нам також потрібно створити інтерфейс/контракт для використання та забезпечити його реалізацію всіма нашими реєстраторами. Створіть це під app/Routing/Contracts/RouteRegistrar і додайте наступний код.

declare(strict_types=1);

namespace App\Routing\Contracts;

use Illuminate\Contracts\Routing\Registrar;

interface RouteRegistrar
{
    public function map(Registrar $registrar): void;
}

Тепер, коли у нас є риса та інтерфейс, ми можемо подивитися на зміни, які нам потрібно внести до постачальника послуг маршруту за замовчуванням.

declare(strict_types=1);

namespace App\Providers;

use App\Routing\Concerns\MapsRouteRegistrars;
use Illuminate\Contracts\Routing\Registrar;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    use MapsRouteRegistrars;

    protected array $registrars = [];

    public function boot(): void
    {
        $this->routes(function (Registrar $router) {
            $this->mapRoutes($router, $this->registrars);
        });
    }
}

З наведеного вище коду ви можете побачити, що ми додали нову властивість нашому постачальнику послуг маршруту. Ця властивість - це місце, де реєстратори маршрутів програми реєструються та завантажуються всередині методу завантаження.

Тепер, коли ми підготували нашу програму до використання реєстраторів маршрутів замість файлів маршрутів, давайте створимо програму за замовчуванням для нашої програми. Цей підхід буде надзвичайно добре працювати в дизайні домену або модульній системі, що дозволяє кожному домену або модулю реєструвати свої маршрути. Для цього прикладу ми збережемо це просто, щоб ви могли зрозуміти підхід. Створіть новий реєстратор маршрутів і app/Routing/Registrars/DefaultRegistrar.php додайте наступний код.

declare(strict_types=1);

namespace App\Routing\Registrars;

use App\Routing\Contracts\RouteRegistrar;

class DefaultRegistrar implements RouteRegistrar
{
    public function map(Registrar $registrar): void
    {
        $registrar->view('/', 'welcome');
    }
}

Тепер, коли наш реєстратор за замовчуванням створений, ми можемо зареєструвати його всередині нашого постачальника послуг маршруту, забезпечуючи його завантаження.

declare(strict_types=1);

namespace App\Providers;

use App\Routing\Concerns\MapsRouteRegistrars;
use App\Routing\Registrars\DefaultRegistrar;
use Illuminate\Contracts\Routing\Registrar;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    use MapsRouteRegistrars;

    protected array $registrars = [
        DefaultRegistrar::class,
    ];
    public function boot(): void
    {
        $this->routes(function (Registrar $router) {
            $this->mapRoutes($router, $this->registrars);
        });
    }
}

Тепер, якщо ви відвідаєте /, ви будете завантажені видом welcome , а це означає, що все підключено правильно. Я можу уявити собі чудовий спосіб, щоб я міг використовувати це у своїй програмі, де у мене є статичні маркетингові маршрути, маршрути блогів, адміністративні маршрути тощо. Як приклад, я б уявив, що постачальник маршрутних послуг виглядає наступним чином:

declare(strict_types=1);

namespace App\Providers;

use App\Routing\Concerns\MapsRouteRegistrars;
use App\Routing\Registrars\AdminRegistrar;
use App\Routing\Registrars\BlogRegistrar;
use App\Routing\Registrars\MarketingRegistrar;
use Illuminate\Contracts\Routing\Registrar;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;

class RouteServiceProvider extends ServiceProvider
{
    use MapsRouteRegistrars;

    protected array $registrars = [
        MarketingRegistrar::class, // Marketing Routes
        BlogRegistrar::class, // Blog Routes
        AdminRegistrar::class, // Admin Routes
    ];
    public function boot(): void
    {
        $this->routes(function (Registrar $router) {
            $this->mapRoutes($router, $this->registrars);
        });
    }
}

Розділення наших маршрутів таким чином - це чудовий спосіб перейти від стандартного файлу маршрутів PHP до системи маршрутизації на основі класів, що дозволяє краще інкапсуляцію з вашою програмою або доменом.

Які ще способи, які ви знайшли, допоможуть вам керувати зростаючим додатком? Особливо з точки зору маршрутизації, через деякий час вони можуть стати трохи неслухняними. Повідомте нас у Твіттері.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Про автора CrazyBoy49z
WORK EXPERIENCE
Контакти
Ukraine, Lutsk
+380979856297