有很多方法可以解决这个问题,我建议使用模板方法模式 http://en.wikipedia.org/wiki/Template_method_pattern,因此您在父类中定义了公共行为,并在子类中处理特定的细节。
abstract class SortPageHandler {
public function getUrlHandler($app)
{
$me = $this;
return function () use ($app, $me) {
$sort = $app->request()->params('sort');
$results = $app->request()->params('results');
$page = $app->request()->params('page');
$app->response()->write($me->getItems($sort, $results, $page));
};
}
abstract public function getItems($sort, $results, $page);
}
class WineHandler extends SortPageHandler {
public function getItems($sort, $results, $page)
{
//return wines
}
}
class CategoryHandler extends SortPageHandler {
public function getItems($sort, $results, $page)
{
//return categories
}
}
class SubCategoryHandler extends SortPageHandler {
public function getItems($sort, $results, $page)
{
//return sub-categories
}
}
所以父类SortPageHandler
使用 Slim 所需的功能以及分页和排序来处理公共部分。每个getItems()
方法特定于每个实体。通过声明这个方法abstract
in SortPageHandler
我们强制所有子类实现此功能。
现在 Slim 代码看起来非常干净:
$app = new \Slim\Slim();
$wineHandler = new WineHandler();
$categoryHandler = new CategoryHandler();
$subCategoryHandler = new SubCategoryHandler();
$app->get('/wines', $wineHandler->getUrlHandler($app));
$app->get('/categories', $categoryHandler->getUrlHandler($app));
$app->get('/sub-categories', $subCategoryHandler->getUrlHandler($app));
$app->run();
与往常一样,您可以进一步重构此代码,但它是为了让您了解如何解决此问题。