用于递归菜单功能的Laravel存储库

时间:2014-11-10 17:42:02

标签: php variables laravel-4 controller repository

我已经尝试了一段时间来了解Laravel中的知识库,但我对各种教程的解释中缺少一些东西。我想我很难理解存储库逻辑。实际上我甚至不确定我是否正确行事。 问题是我有一个递归函数来构建一个菜单,我正在尝试抽象它,所以我可以更自由地使用它。 现在,我想要实现的是一种将变量$ mainPages传递给HomeController上的每个方法的方法。我将在上面发布我的代码的最后一个版本。希望有人可以对我说一些关于我可能做错的事情,因为无论我尝试什么,我都会得到一个Undefined变量。

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;
}

1 个答案:

答案 0 :(得分:0)

它位于侧边栏作曲家文件中 -

变化:

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');