各种Laravel控制器方法之间的通用逻辑

时间:2015-03-30 09:54:13

标签: php laravel laravel-5

假设我有一个这样的网址:

/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
    }
}

还有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

即使你有不同的看法,我相信中间件是最好的解决方案。

首先,使用php artisan make:middleware CityCheckMiddlewareApp/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函数。