Тонкая структура и автоматизированная групповая маршрутизация - PullRequest
0 голосов
/ 15 марта 2019

Я хотел бы переместить всю логику в контроллеры следующим образом: файл index.php:

$app = new Slim\App();
$app->group('/api/v1', function (\Slim\App $app) {
    $app->group('/users', UsersController::class );
});

Файл UsersController.php:

class UsersController
{
    public function __construct(\Slim\App $app)
    {
        $app->getContainer()->get('db');

        $app->map(['GET'], '/', [$this, 'readAll']);
        $app->map(['POST'], '/', [$this, 'create']); //Create a new
        $app->map(['PUT'], '/', [$this, 'updateAll']);
        $app->map(['DELETE'], '/', [$this, 'deleteAll']);

        $app->map(['GET'], '/{id}', [$this, 'read']);
        //$app->map(['POST'], '/{id}', [$this, 'createNot']); //Method not allowed (405)
        $app->map(['PUT'], '/{id}', [$this, 'update']);
        $app->map(['DELETE'], '/{id}', [$this, 'delete']);
    }

    ...

}

Но всегда я получаю сообщение об ошибке:

Аргумент 1, передаваемый UsersController :: __ construct (), должен быть экземпляром Slim \ App, экземпляром Slim \ Container с указанием

Что делать, чтобы работать?

1 Ответ

1 голос
/ 18 марта 2019

Если контроллер не зарегистрирован в контейнере, то по умолчанию Slim пытается создать контроллер самостоятельно и передать экземпляр контейнера конструктору. Но поскольку вы напечатали подсказку, что конструктор контроллера ожидает Slim\App экземпляр, значит, вы получите ошибку.

Но я думаю, что на самом деле вам нужен маршрут типа

$app->group('/app/v1', function () use ($app) {
   $app->group('/users', function () use ($app) {
      $app->get('/', UsersController::class . ':readAll');
      $app->post('/', UsersController::class . ':create');
      $app->put('/', UsersController::class . ':updateAll');
      $app->delete('/', UsersController::class . ':deleteAll');

      $app->get('/{id}', UsersController::class . ':read');
      $app->put('/{id}', UsersController::class . ':update');
      $app->delete('/{id}', UsersController::class . ':delete');
   });
});

Так что больше нет необходимости настраивать маршрут в конструкторе контроллера.

Но если вы все еще хотите идти тем же путем, что и сейчас, вам нужно зарегистрировать контроллер в контейнере.

$container[UsersController::class] = function ($c) use($app) {
    return new UsersController($app);
});

Лично я бы не рекомендовал это.

...