2017-01-12 4 views
1

Я чувствую, что повторяюсь в контроллерах Laravel (4). Например, для каждого представления мне нужно около $variables. Я получаю их из кеша или базы данных. Поскольку получение и обработка их берут некоторые строки кодов (между 5-100 строк), я повторяю их в каждой функции контроллера. Это особенно актуально при обновлении функций (они увеличивают сложность).Как я могу избежать повторения в контроллерах Laravel (4)?

Как я могу избежать этого без какого-либо отрицательного эффекта?

Примечание: $variables в основном не являются глобальными переменными.

+0

Вы могли бы абстрактные на это в метод класса, что ваш контроллер загружает через конструктор. Это означало бы написание кода один раз, но вызов его несколько раз. – jardis

ответ

1

Существует много способов сделать это, но, похоже, переменные более специфичны для вашего представления, чем ваши контроллеры.

Вы можете легко обменивать переменные по вашим представлениям в методе boot вашего AppServiceProvider.

view()->share('variables', function(){ 
    //you can share whatever you want here and it will be availble in all views. 
}); 
+0

Я вижу, но большинство переменных являются специфичными для пользователя, например, переменная subscriptions. Таким образом, они в основном не являются глобальными. – horse

+0

Ohgodwhy, какой из ответов Томаса лучше, как вы думаете? – horse

+0

@ user2356198 Я бы предложил использовать Trait, в данном случае. – Ohgodwhy

1
  • Вы можете создать статический вспомогательный класс (все статические функции) например

    class VarHelper { 
        public static function getVars() { 
         return []; 
        } 
    } 
    
  • Вы можете создать свой собственный basecontroller вы расширяете в любом другом контроллере например

    class MyController extends Controller { 
        public function getVars() { 
         return []; 
        } 
    } 
    
    class BlaController extends MyController { 
        public function doBla() { 
         $vars = $this->getVars(); 
        } 
    } 
    
  • создания функции внутри контроллера и вызвать его в других функциях

  • Используйте Trait

  • и, вероятно, больше решений
+0

Thomas, должен ли класс 'VarHelper' быть' BaseController' расширенным или открытым? Мне кажется, что второй выбор более элегантный? Какой из них лучше для производительности, первый или второй? – horse

+0

Я думаю, что это не имеет большого значения для производительности в реальном мире. 'Varhelper' - это просто статический вспомогательный класс, который ничего не продлевает! –

+0

Я использовал BaseController, но когда я вызываю функцию 'getVars' из функции' doBla', это приводит к ошибке 404 :( – horse

0

Создание trait с помощью метода к установите все необходимые переменные.

use View; 

trait SharedControllerVariables { 

    public function loadUsersSubscription() { 
     View::make('user_subscription_variable_1', [...data...]); 
     View::make('user_subscription_variable_2', [...data...]); 
    } 
} 

Затем вызовите его в конструкторе контроллера:

class MyController extends Controller { 

    use SharedControllerVariables; 

    public function __construct() { 
     $this->loadUsersSubscription(); 
    } 
} 
Смежные вопросы