超薄框架和自动组路由
Slim framework and automated group routing
我想像这样将所有逻辑移动到控制器中:
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']);
}
...
}
但我总是出错:
Argument 1 passed to UsersController::__construct() must be an
instance of Slim\App, instance of Slim\Container given
上班要做什么?
当控制器未在容器中注册时,默认情况下,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);
});
就我个人而言,我不会推荐这个。
我想像这样将所有逻辑移动到控制器中: 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']);
}
...
}
但我总是出错:
Argument 1 passed to UsersController::__construct() must be an instance of Slim\App, instance of Slim\Container given
上班要做什么?
当控制器未在容器中注册时,默认情况下,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);
});
就我个人而言,我不会推荐这个。