Я довольно новичок в 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 будут в какой-то момент использовать эти объекты, поэтому загружать их все для каждого класса, я думаю, правильно. Мои главные два вопроса:
- Как дорого, с чистой точки зрения кода, создает несколько объектов, подобных этому, прежде чем они понадобятся. Я включил их в файл BaseController, потому что обнаружил, что повторяю эти включенные определения в многочисленных файлах, которые наследуются от BaseController.
- С точки зрения 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);
}
Это ранняя стадия и я рефакторинг, как я иду, который где этот вопрос зависимостей класса пришел с.
Чтения и использовать это: http://laravel.com/docs/ ioc –
@Sergiu Используя IoC, все классы 10+ будут создаваться каждый раз, когда BaseController (или его дочерние элементы) будет построен еще, нет? – Unnawut
А я плохо, используя 'App :: singleton()' и возвращая фабрику, может работать, я думаю – Unnawut