假设我有一个这样的网址:
/city/nyc (display info about new york city)
和另一个像这样:
/city/nyc/streets (display a list of Street of nyc)
我可以将它们绑定到这样的方法:
Route::get('city/{city}', 'CityController@showCity');
Route::get('city/{city}/streets', 'CityController@showCityStreet');
问题是我需要在两种方法上对城市执行一些检查(例如,如果数据库中存在{city})。 我可以创建一个方法并像这样调用它们:
class CityController {
private function cityCommonCheck($city) {
// check
}
public function showCity($city) {
$this->cityCommonCheck($city);
// other logic
}
public function showCityStreet($city) {
$this->cityCommonCheck($city);
// other logic
}
}
还有更好的方法吗?
答案 0 :(得分:3)
即使你有不同的看法,我相信中间件是最好的解决方案。
首先,使用php artisan make:middleware CityCheckMiddleware
在App/Http/Middleware
中创建一个类。然后编辑方法以执行检查应该执行的操作并添加构造函数以注入Router
public function __construct(\Illuminate\Http\Routing\Router $router){
$this->route = $router;
}
public function handle($request, Closure $next)
{
$city = $this->route->input('city');
// do checking
return $next($request);
}
在App/Http/Kernel.php
中定义速记键:
protected $routeMiddleware = [
'auth' => 'App\Http\Middleware\Authenticate',
// ...
'city_checker' => 'App\Http\Middleware\CityCheckerMiddleware',
];
然后,在你的控制器中:
public function __construct()
{
$this->middleware('city_checker', ['only' => ['showCity', 'showCityStreet']]);
}
答案 1 :(得分:2)
我认为最好的方法是,你可以将常用的逻辑移到模型中。所以你的代码会在下面。
class CityController {
public function showCity($city) {
City::cityCommonCheck($city);
}
public function showCityStreet($city) {
City::cityCommonCheck($city);
}
}
class City{
public static function cityCommonCheck($city) {
//put here your logic
}
}
通过这种方式,您可以从任何控制器调用cityCommonCheck函数。