2014-07-04 4 views
0

Я довольно новичок в Laravel и задавался вопросом, какой самый эффективный способ создания экземпляров и создания нескольких объектов для моих классов.Создание экземпляра нескольких объектов Laravel

Пример того, что я делаю в данный момент было бы, в виду SUDO код:

// MainController.php

<?php 

Class MainController extends BaseController { 

    public function __construct() { 
      parent::construct();   
    } 

    // class code follows 
} 

// BaseContoller.php

<?php 

use classFile; 
Use repositoryFile; 
use classFile2; 
Use repositoryFile2; 

..... and lets say 10 more "included" files 

Class BaseController extends Controller { 

    var classFile; 
    var repositoryFile; 
    var classFile2; 
    var repositoryFile2; 

    ..... and 10 more variables; 

    public function __construct() { 

      $this->classFile = new classFile;  
      $this->classFile = new classFile; 
      $this->repositoryFile = new repositoryFile; 
      $this->classFile2 = new classFile2; 
      $this->repositoryFile2 = new repositoryFile2; 

      ..... and 10 more class instantiations 

     } 

     // class code follows 

} 

Надеемся что имеет смысл .....

Практически все мои классы, наследующие BaseController будут в какой-то момент использовать эти объекты, поэтому загружать их все для каждого класса, я думаю, правильно. Мои главные два вопроса:

  1. Как дорого, с чистой точки зрения кода, создает несколько объектов, подобных этому, прежде чем они понадобятся. Я включил их в файл BaseController, потому что обнаружил, что повторяю эти включенные определения в многочисленных файлах, которые наследуются от BaseController.
  2. С точки зрения Laravel есть лучший способ создания такого рода вещей? Первоначально я их вводил через каждый конструктор классов, но снова они повторялись (одно и то же определение в нескольких файлах) и становились ужасно большими.

Я следил за множеством ларакастских ружей, а также различными материалами для чтения, но я еще не видел, как люди обрабатывают большой объем объектов, как я пытаюсь использовать. Или, возможно, именно там, где я собираюсь «ошибаться»?

Cheers!

== Вот пример вызова главной страницы API, над которым я работаю. Он объединяет содержимое из всех по всему сайту в корм для мобильного приложения:

public function index() 
{ 
    $channels = $this->channelRepository->getChannels(); 
    $allChannels = $this->channelRepository->getAllChannels(); 
    $sponsors = $this->sponsorRepository->getSponsors(); 
    $inactiveUserChannels = []; 

    // use the pattern maker, set the pattern we want to use 
    $this->patternMaker->setPattern(1); 

    $channelFeed = []; 

    if(userIsAuthenticated()) 
    { 
     $inactiveUserChannels = $this->userRepository->getUserInactiveChannels(1);  
    }   

    // Picks 
    $picks = $this->articleRepository->getArticles('picks', 25); 

    $ads = $this->sponsorRepository->getWhereNotInCollection($sponsors, 30); 
    $response = $this->patternMaker->make([ 'articles' => $picks, 'sponsors' => $ads ]); 
    $picks = $response->articles; 
    $ads = $response->sponsors; 

    // Whats on 
    $channel = 50; 

    $whatsOn = $this->articleRepository->getArticlesWithEvents(null); // get 20 articles from the whats on channel 
    $response = $this->patternMaker->make([ 'articles' => $whatsOn, 'sponsors' => $ads ], "whats-on"); 
    $whatsOn = $response->articles; 

    $ads = $response->sponsors; 

    $channel = $this->channelTransformer->transform(getChannel($channels, $channel)); 
    $channel['articles'] = $whatsOn; 

    $channelFeed[] = $channel; 

    // create a new instance of the channel feed class and pass the required params to it 

    $this->channelFeed = $this->createChannelFeed($allChannels, [ 48, 49, 51, 52 ], $ads, $inactiveUserChannels); 

    if(! $response = cached("homepage")) 
    { 
     $data = [ 
      'channels' => $this->channelTransformer->transformCollection($channels) 
      ,'adverts' => $this->sponsorTransformer->transformCollection($sponsors->toArray()) 
      ,'features' => $this->articleTransformer->transformCollection($this->articleRepository->getArticles('featured', 25), [ 'showBody' => false]) 
      ,'picks' => $picks 
      ,'channelFeed' => $this->channelFeed->make() 
     ]; 

     cacheIt("homepage", $response, "1 hour"); 
    } 

    return $this->respondFound(Lang::get('api.homepageFound'), $data); 
} 

Это ранняя стадия и я рефакторинг, как я иду, который где этот вопрос зависимостей класса пришел с.

+1

Чтения и использовать это: http://laravel.com/docs/ ioc –

+0

@Sergiu Используя IoC, все классы 10+ будут создаваться каждый раз, когда BaseController (или его дочерние элементы) будет построен еще, нет? – Unnawut

+0

А я плохо, используя 'App :: singleton()' и возвращая фабрику, может работать, я думаю – Unnawut

ответ

0

Во-первых, если у вашего конструктора MainController больше логики, вы можете просто оставить конструктор вместе, а конструктор BaseController будет вызываться напрямую.

Вы можете сделать это:

Class BaseController extends Controller { 

     protected $classFile; 
     //repeat for all classes 

     function classFile() { 
      if(!$this->classFile) $this->clasFile = new classFile; 
      return $this->classFile; 
     } 
     //repeat for all classes 

     function useExample() { 
      $this->classFile()->randomMethod(); 
     } 

} 

... так по крайней мере, вы не более чем создание экземпляра необходимо.

Это неоспоримый сказал, что это звучит как то, что вы действительно хотите фасадный, и вы можете просто пойти:

$channels = ChannelRepository::getChannels(); 

http://laravel.com/docs/facades

+1

Я не думаю, что создание контроллера как фабрики - очень хорошая идея. Вы также генерируете еще больше накладных расходов, чем в настоящее время. – thpl

+0

@fiffen Спасибо. Я использую фасады в своем приложении с моими репозиториями и тому подобное. То, что мне нужно сделать, это вытащить много данных из БД, перебрать его, чтобы получить то, что мне нужно, отформатировать и вернуть в предопределенном объекте ответа для мобильного приложения. Я не могу понять, как я уменьшу зависимости в этом единственном действии контроллера для достижения той же цели (отсюда и мой вопрос). Хорошие примеры, хотя, приветствия. – Schneidey

+1

Вы можете написать класс, который получает «запрос», извлекает данные с помощью службы, сопоставляет ее с структурой, которая вам нужна, с помощью сопоставления и возвращает ее. –

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