Некоторое время я пытался разобраться с репозиториями в Laravel, но чего-то не хватает в моих интерпретациях различных уроков. Я думаю, мне трудно понять логику репозиториев. На самом деле, я даже не уверен, правильно ли я иду.
Дело в том, что у меня есть рекурсивная функция для создания меню, и я пытаюсь абстрагировать его, чтобы я мог использовать его более свободно.
Прямо сейчас я пытаюсь достичь способа передачи переменной $ mainPages через каждый метод HomeController. Я опубликую несколько последних воплощений моего кода выше. Надеюсь, что кто-то может пролить свет на меня, о том, что я могу делать неправильно, потому что я продолжаю получать неопределенную переменную независимо от того, что я пытаюсь.
routes.php
Route::get('{lang}/{slug}', array('uses'=>'HomeController@getPages'));
MainPagesRepository.php
namespace Repositories;
use Page;
class MainPagesRepository {
public function getAll()
{
$mainPages = Page::join('langs', 'langs.id', '=', 'pages.lang_parent_id')
->where('parent_id', null)
->get();
return $mainPages;
}
}
SidebarComposer.php
namespace Composers;
use Repositories\MainPagesRepository;
class SidebarComposer {
protected $mainPages;
public function __construct(MainPagesRepository $mainPages)
{
$this->mainPages = $mainPages;
}
public function compose($view)
{
$view->with('mainPages', $this->mainPages->getAll());
}
}
Composer.php
View::composer('index', 'Composers\SidebarComposer');
HomeController.php
public function getPages($lang, $slug)
{
$allPages = $this->getAllPages($mainPages);
return View::make('index')
->with('allPages', $allPages);
}
private function getAllPages($pages) {
$allPages = array();
foreach ($pages as $page) {
$subArr = array();
$subArr['title'] = $page->title;
$subArr['slug'] = $page->slug;
$subPages = Page::where('parent_id', '=', $page->id)
->get();
if (!$subPages->isEmpty()) {
$result = $this->getAllPages($subPages);
$subArr['sub'] = $result;
}
$allPages[] = $subArr;
}
return $allPages;
}
Это в вашем файле композитора боковой панели —
менять:
protected $mainPage;
в
protected $mainPages;
менять
$view->with('mainPages', $mainPages->mainPages->getAll());
в
$view->with('mainPages', $this->mainPages->getAll());
Вам также может понадобиться изменить свою строку:
View::composer('index', 'Composers\SidebarComposer');
в
View::composer('*', 'Composers\SidebarComposer');
Других решений пока нет …