我正在学习如何通过编写一个小测试应用程序来使用Laravel。到目前为止,它的进展非常顺利,我对框架的所有功能感到兴奋。但是,当我尝试应用特定的设计模式时,我不断碰壁。
我目前有一个设置,我可以在基本控制器中使用默认值设置html标题,关键字和描述,然后可选地在扩展它的子控制器中更改它们:
基础控制器
protected function setupLayout()
{
$this->layout->title = 'Wow website';
$this->layout->desc = 'Much technical';
$this->layout->keys = 'so html, very javascript';
$foot = View::make('mod.footerDefault');
$this->layout->footer = $foot;
}
儿童控制器
public function getContact()
{
$this->title = 'Contact page of contactness';
// Could also override the desc and keys if desired,
// but I'll just let them default here
$data = 'wow';
$view = View::make('main.home', $data)
->nest('vid', 'mod.video')
->nest('list', 'mod.list');
$this->layout->content = $view;
}
这一切都很好看,但如果我有一个与之交互过的对象,例如菜单类,需要重新编译成HTML字符串呢? laravel中的方法是否类似于自动调用的setupLayout()方法,但是每次调用View :: make方法时都会这样做?
(更多例子......只是为了说明)
基础控制器
protected function setupLayout()
{
$this->menu = newMenu();
$this->menu->items[0] = ['contact-us', 'Contact us'];
$this->menu->items[1] = ['about-us', 'About us'];
$this->menuString = $this->menu->getString();
}
儿童控制器
public function getContact()
{
$this->menu->addItem(['log-out', 'Log out']);
// Now $this->menuString must be recalculated.
// Ideally want to avoid having to call a method from the base controller
// every time the child controller calls View::make
$view = View::make('main.home')
$this->layout->content = $view;
}
我知道有一些视图作曲家,但我不认为这些是在View :: make()上调用的。
答案 0 :(得分:1)
我使用视图编辑器创建导航/菜单结构。
view/parts/navigation.blade.php
)创建一个视图,其中仅包含根据视图编辑器提供的数据创建的导航View::composer(your_view, your_composer)
@include('parts.navigation')
此合成器函数不会在每个View::make()
上调用,而是在包含所包含导航部分的视图的每个品牌上调用。这就是你需要的。
以下是视频作曲家的工作方式:http://culttt.com/2014/02/10/using-view-composers-laravel-4/
答案 1 :(得分:0)
以下我是如何让它最终运作的:
路线文件(稍后会将其移至更合适的位置):
// NB: KoBsMenu is the name of the menu class
App::before(function($request) {
$menu = [
'brand' => [
'left' => 'asdf',
'right' => ['floppy-save']
],
'leftItems' => [
'home' => [1, 'home', 'Home'],
'factories' => [2, [
'aboutF' => [1, 'about-factories', [''], 'About factories'],
'factoryL' => [2, 'factory-life', 'Factory life'],
'uk' => [3, [
'leeds' => [1, 'leeds', 'Leeds'],
'reading' => [2, 'reading', 'Reading']
], 'UK'],
'usa' => [4, [
'austin' => [1, 'austin', 'Austin'],
'kansas' => [2, 'kansas', 'Kansas']
], 'USA']
], 'Factories', ['tower']],
...
];
App::singleton('mainMenu', 'KoBsMenu');
$KoBsMenu = App::make('mainMenu');
$KoBsMenu->buildMenu($menu);
});
View::composer('*', function($view)
{
$KoBsMenu = App::make('mainMenu');
$mainMenu = $KoBsMenu->getMenuHtml();
$view->with('mainMenu', $mainMenu);
});
然后在基本控制器中
$this->KoBsMenu = App::make('mainMenu');
然后,如果需要,我可以在主控制器中以编程方式添加/删除菜单项。
$this->KoBsMenu->menu['leftItems']['testasfd'] = [1, 'bloh', [''], 'Bloh']; // Will be a public method ultimately
然后最后在视图中:
{{ $mainMenu or '' }}