Расширение API Laravel Router - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь расширить класс маршрутизатора Laravel 5.6, добавив несколько удобных методов для регистрации маршрутов.

Я создал класс, который расширяет класс Illuminate\Routing\Router, например:

Namespace App\Overrides;

use Illuminate\Routing\Router as LaravelRouter;

class Router extends LaravelRouter
{

    public function apiReadResource($name, $controller, array $options = [])
    {
        $this->resource($name, $controller, array_merge([
            'only' => ['index', 'show'],
        ], $options));
    }

    public function apiWriteResource($name, $controller, array $options = [])
    {
        $this->resource($name, $controller, array_merge([
            'except' => ['index', 'show', 'edit', 'create', 'destroy'],
        ], $options));
    }

    public function apiRelationshipResources($name, $controller, array $relationships, array $options = [])
    {
        foreach($relationships as $relationship)
        {
            $this->get(
                $name.'/{id}/'.$relationship,
                [
                    'uses' => $controller . '@' . $relationship,
                    'as'   => $name . '.' . $relationship,
                ]
            );
        }
    }

}

Я зарегистрировал свой расширенный класс как этот по умолчанию App\Providers\RouteServiceProvider:

namespace App\Providers;

use Illuminate\Routing\Router;
use App\Overrides\Router as APIRouter;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';


    public function register()
    {
        $this->app->singleton('router', function ($app) {
            return new APIRouter($app['events'], $app);
        });
    }

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    [more code...]
}

В файле маршрутов я вызываю свои собственные пользовательские методы, такие как: Route::apiWriteResource('users', 'UserController'); или как этот Route::apiRelationshipResources('users', 'UserController', ['reviews']);

Все маршруты зарегистрированы и правильно отображаются в php artisan route:list, но на самом деле ни один из маршрутов не работает.Все они дают стандартную страницу 404.

Что я делаю не так?Что я пропустил?

1 Ответ

0 голосов
/ 31 мая 2018

На основе документации от здесь , здесь , здесь и регистрации Router.php Я пришел к мысли написать ответ,

Попробуйте выполнить следующие действия:

1) Создать Маршрутизация папка внутри app Папка

Создать макросы :

2) app \ Routing \ ApiReadResource.php с таким содержимым:

<?php
namespace App\Routing

use Illuminate\Routing\Router;


class ApiReadResource
{
    public static function register()
    {
        if (!Router::hasMacro('apiReadResource')) {
            Router::macro('apiReadResource', function ($name, $controller, $options = []) {
                Router::resource(
                   $name, 
                   $controller, 
                   array_merge(['only' => ['index', 'show']], $options)
                );
            });
        }
    }
}

3) app \ Routing \ ApiWriteResource.php с таким содержанием:

<?php
namespace App\Routing

use Illuminate\Routing\Router;


class ApiWriteResource
{
    public static function register()
    {
        if (!Router::hasMacro('apiWriteResource')) {
            Router::macro('apiWriteResource', function ($name, $controller, $options = []) {
                Router::resource(
                   $name, 
                   $controller, 
                   array_merge(['except' => ['index', 'show', 'edit', 'create', 'destroy']], $options)
                );
            });
        }
    }
}

4) app \ Routing \ ApiRelationshipResources.php с таким содержанием:

<?php
namespace App\Routing

use Illuminate\Routing\Router;


class ApiRelationshipResources
{
    public static function register()
    {
        if (!Router::hasMacro('apiRelationshipResources')) {
            Router::macro('apiRelationshipResources', function ($name, $controller, array $relationships, $options = []) {
              foreach($relationships AS $relationship) {
                Router::get(
                   $name.'/{id}/'.$relationship,
                   array_merge($options, [
                     'uses' => $controller . '@' . $relationship,
                     'as'   => $name . '.' . $relationship,
                   ])
                );
              }
            });
        }
    }
}

5) Зарегистрируйте их внутри AppServiceProvider :

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {

    }
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        \App\Routing\ApiReadResource::register();
        \App\Routing\ApiWriteResource::register();
        \App\Routing\ApiRelationshipResources::register();
    }
}
...