2015-03-30 3 views
2

Допустим, у меня есть URL-адрес, как это:Общая логика между различными контроллерами Laravel метод

/city/nyc (display info about new york city) 

и другой, как это:

/city/nyc/streets (display a list of Street of nyc) 

я могу связать их методом, как это:

Route::get('city/{city}', '[email protected]'); 
Route::get('city/{city}/streets', '[email protected]'); 

Проблема в том, что мне нужно выполнить некоторые проверки в городе (например, если {city} присутствует в базе данных) на обоих m ethods. я мог бы создать метод и вызывать их в обоих, как это:

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

Вы можете написать [промежуточное программное обеспечение] (http://laravel.com/docs/5.0/middleware) для него – lukasgeiter

+0

Я не думаю, что промежуточное ПО является лучшим вариантом для этого, я думал g, чтобы поместить проверку внутри конструктора контроллера, но как я могу получить доступ к {city} из конструктора? –

+1

Почему вы так думаете? Вы можете получить доступ к '{city}' с использованием фасада маршрута 'Route :: input ('city')' или путем ввода класса '$ router-> класса' Router' ('city') ' – lukasgeiter

ответ

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 из любого контроллера.

+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', 
]; 

Затем в контроллере:

+0

Очень интересно, но кроме проверок мой метод возвращает некоторые данные (строка города). Я не думаю, что могу сказать промежуточному программному обеспечению передать эти данные контроллеру, или я могу? –

+0

Ну, вы могли бы обойти это и передать его с помощью сеанса или какого-то другого глобального хранилища, но это не значит, что для промежуточного программного обеспечения это не так. Если вы вызываете свою функцию для получения некоторых данных, вы должны оставить ее в контроллере или лучше перенести ее в модель или в класс репозитория/помощника. – lukasgeiter

Смежные вопросы