2014-05-27 3 views
3

Я хочу сделать тестовый код в контроллерах Laravel 4. Я знаю, что DI (Dependency Injection), и я знаю, что тестируемый код может выглядеть следующим образом:Инъекция зависимостей в контроллерах Laravel 4 экземпляров всех объектов

class UsersController extends BaseController 
{ 
    public function __construct(User $user, Notice $notice) 
    { 
     $this->user = $user; 
     $this->notice = $notice; 
    } 

    public function getIndex() 
    { 
     ... 
     $this->user 
     ... 
     $this->notice 
     ... 
    } 

    public function getPage() 
    { 
     ... 
     $this->user 
     ... 
    } 
} 

Как вы можете видеть, что я впрыскивается два объекта в контроллер.

Для getIndex функция, она совершенна, я использую в ней два объекта.

Но, пожалуйста, обратите внимание, что для getPage функция, я просто использую $this->user, мне не нужен $this->notice.

Однако объект $this->notice был создан уже, это действительно не очень хорошо.

Есть ли лучший способ не включать все объекты?

ответ

5

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

Если это проблема производительности в вашем приложении, то у вас есть следующие решения:

  • ленивой инъекции. Я не знаю, предлагает ли Laravel DI контейнер этой функции, но идея заключается в том, чтобы ввести прокси-сервер, который будет загружать службу лениво. Если служба не используется, она не загружается.
  • отдельные контроллеры. Вы можете разделить свой контроллер на два, чтобы вы только вводили сервисы, которые вы действительно используете. Иногда тот факт, что некоторые зависимости не используются, является признаком того, что класс/контроллер делает слишком много вещей, поэтому его разделение в любом случае является хорошей вещью.

Но вам, вероятно, не нужно создавать инъекции объекта, который вы не используете, потому что вы сохраните только 0,00001 секунду, и никто не увидит разницу.

+0

Если вы структурировать свой код прямо в Laravel тогда да, ленивая загрузка возможна. Вам просто нужно явно создать файлы, необходимые во время выполнения в начале global.php, а затем загрузить другие с обычным вызовом имен. Кроме того, для тестирования я предлагаю помещать пользовательские классы в файлы composer.json, поскольку они устанавливают их в глобальном средстве неинтегрируют их вовремя для тестового времени выполнения. – Gokigooooks

1

Laravel 5 планируется контроллер.

http://laravel.com/docs/master/releases#laravel-5.0

+0

Теперь это называется Laravel 5, и вот хороший вид, описывающий новую инъекцию метода: https: //laracasts.com/series/whats-new-in-laravel-5/episodes/2 –

+0

Хорошо. Я исправил свой ответ. –

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