Laravel 以一种很好的方式使用多个控制器和视图

Posted

技术标签:

【中文标题】Laravel 以一种很好的方式使用多个控制器和视图【英文标题】:Laravel using multiple Controllers and View in an nice way 【发布时间】:2014-04-09 07:07:53 【问题描述】:

我刚开始使用 Laravel,所以请耐心等待。

我正在尝试使用left content panemiddle content paneright content pane 制作某种CMS,你们可能都知道...

这是描述我的目标的图片:

我的问题是:我怎样才能以漂亮、好看的方式实现这一目标?我必须在路由文件中做什么以及我的控制器看起来如何?

我已经学习了Laracast 的基本教程,所以我知道基础知识,但仅此而已......

我真的希望有人可以帮助我(或指出正确的方向)。因为我想在一开始就以正确的方式去做,而不是在 6 个月之后......

【问题讨论】:

对于侧窗格,使用composer,然后包含在布局中。将为您省去很多麻烦。 @itachi,好吗?!?我认为composer只是一个依赖库,你可以很容易地安装一些包。你的意思是我应该通过composer安装一个包吗?还是我没看懂? itachi 的意思是 laravel 的视图作曲家laravel.com/docs/responses#view-composers。阅读后,如果您有任何问题,请回来告诉您希望如何控制渲染或不控制这些侧窗格? 【参考方案1】:

首先,您必须找到一个模板或自己创建一个。我将假设您将使用 Bootstrap,因此请查看 this link 以获得一个不错的仪表板模板。如果你用谷歌搜索,你可以找到更多(免费或付费)。所以你终于找到了你的模板!下一步你要怎么做?我会告诉你我的方法。

打开您下载的模板并剥离所有内容而不触及位置。例如,在模板中,主菜单可能会放置在一个 div 中,例如:

<div class="left-side">

  <ul class="menu">

    <li>...</li>

    <li>...</li>

  </ul>

</div>

去掉&lt;ul&gt;,只留下&lt;div&gt;。您将在那里放置您的菜单(稍后您将看到如何)。

在所有位置都这样做之后,你会得到这样的结果:

<div>

  <div class="left-side"></div>

  <div class="main-content"></div>

</div>

当然,它会远不止这些,但你明白了。这是您的主布局。在您的视图中创建一个文件夹,例如layouts 并将其保存为master.blade.php

现在再次打开并更改为:

<div>

  <div class="left-side">@include('partials.menu')</div>

  <div class="main-content">@yield('content')</div>

</div>

菜单的工作原理

在你的应用目录中创建一个新文件(与routes.php同级)并命名为composers.php

打开app/start/global.php并放在文件末尾

require app_path().'/composers.php';

这样composers.php 文件中的代码将在每次调用中触发。

在composer.php里面写如下代码:

View::composer('layouts.master', function($view)

  // Just a sample. Get all menu items from the database

  $menus = Menu::all() ;

  // This way $menus will always be available in your master.blade.php

  $view->with('menus', $menus);

);
在您的视图文件夹中创建一个文件夹partials,并在该文件夹中创建menu.blade.php。现在打开menu.blade.php 并输入以下代码:

&lt;ul&gt;

@foreach($menus as $menu)

  <li> $menu->title </li>    

@endforeach

&lt;/ul&gt;

你的菜单准备好了!

当然,您将需要实现更多逻辑,例如菜单突出显示等,但这将帮助您入门。

主要内容的运作方式

要让您的内容出现在主区域中,您的所有视图都必须扩展主布局。假设您有以下路线:

Route::resource('posts', 'PostsController');

调用例如h**p://www.example.com/posts 会触发PostsController中的index函数

class PostsController extends BaseController 

  public function index()
  
    $posts = Post::all();

    return View::make('posts.index', compact('posts'));
  

然后它将调用views/posts/index.blade.php 文件

@extends('layouts.master')

@section('content')

  @foreach($posts as $post)

    <p> $post->content</p>

  @endforeach

@stop

将 $menus 变量传递给它并将其放在主布局中。

我希望这能让你开始,我也希望我的代码中没有任何拼写错误!

并且不要忘记,如果有现成的模板,则必须

    自己负责资产管理(.css、.js 等)

    让您的代码符合模板样式表

【讨论】:

谢谢你的回答,这似乎是我一直在寻找的答案,但是......我收到错误View [partials.menu] not found. 但我有文件menu.blade.php 在里面app/views/partails 文件夹所以文件在那里但找不到它?即使我删除了.blade 扩展名,也会引发错误......你知道可能是什么问题吗? app/views/partails只是一个错字吗? 哇,这确实是一个错字。非常感谢你。它现在正在工作!

以上是关于Laravel 以一种很好的方式使用多个控制器和视图的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin:如何将两个语句“应用”和“让”以一种很好的方式放在一起?

如何在 laravel 上以一种形式使用两个控制器方法?

有没有办法以从 django 视图中作为上下文传递的一种很好的方式在 html 中显示 json 结果?

laravel中的事件处理

Android 列表视图异常

c++ winapi线程