# 10. blade layout
這一節我們來學習下 `blade` 這個 view engine 的 `layout` 功能,主要是實現下面一個頁面。

這個頁面的 html 和 css 的代碼都是抄自 `bootstrap` 官網的一個叫 `narrow-jumbotron` 的demo。
它的網址如下:
<http://getbootstrap.com/docs/4.0/examples/narrow-jumbotron/>
**如果在下面的演示過程中發現有缺少的 css 的文件,都在上面這個網址里下載(查看源代碼)。**
這一節比較簡單,因為在以前的文章中都有講到如何去創建一個頁面的,而這節主要是來感受一下 `laravel` 的 view 中的 `layout` 功能。
## 1. 創建 route
為了更好地演示,我們來新創建一個新的 route。
按照之前學到的知識,在 `routes/web.php` 文件中添加如下這行 route:
```
// routes/web.php
<?php
Route::get('blade', 'PagesController@blade');
```
## 2. 添加 bladetest action
接著,在controller文件 `app/Http/PagesController.php`,添加一個 action,內容如下:
```
// app/Http/PagesController.php
<?php
...
class PagesController extends Controller
{
...
public function blade()
{
return view('blade.bladetest');
}
}
```
## 3. 創建 view
在 `resources/views/blade` 目錄下添加 `bladetest.blade.php` 文件,內容如下:
```
@extends('layouts.master')
@section('title')
Blade
@endsection
@section('body')
<div class="jumbotron">
<h1 class="display-3">Jumbotron heading</h1>
<p class="lead">Cras justo odio, dapibus ac facilisis in, egestas eget quam. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
<p><a class="btn btn-lg btn-success" href="#" role="button">Sign up today</a></p>
</div>
<div class="row marketing">
<div class="col-lg-6">
<h4>Subheading</h4>
<p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>
<h4>Subheading</h4>
<p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>
<h4>Subheading</h4>
<p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
</div>
<div class="col-lg-6">
<h4>Subheading</h4>
<p>Donec id elit non mi porta gravida at eget metus. Maecenas faucibus mollis interdum.</p>
<h4>Subheading</h4>
<p>Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum.</p>
<h4>Subheading</h4>
<p>Maecenas sed diam eget risus varius blandit sit amet non magna.</p>
</div>
</div>
@endsection
```
關鍵在于第一行 `@extends('layouts.master')`,表示會使用 `master` 這個 layout,我們來創建一下這個文件。
## 4. 創建 master layout
在`resources/views/layouts`目錄下添加一個文件,叫`master.blade.php`,內容如下:
```
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="">
<meta name="author" content="">
<link rel="icon" href="../../../../favicon.ico">
<title>@yield('title')</title>
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/narrow-jumbotron.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="header clearfix">
<nav>
<ul class="nav nav-pills float-right">
<li class="nav-item">
<a class="nav-link active" href="#">Home <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">About</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Contact</a>
</li>
</ul>
</nav>
<h3 class="text-muted">Project name</h3>
</div>
@yield('body')
<footer class="footer">
<p>? Company 2017</p>
</footer>
</div> <!-- /container -->
<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</body>
</html>
```
如果發現沒有格式,或格式不對,可能是下面的 css 沒有引用成功:
```
<!-- Bootstrap core CSS -->
<link href="css/bootstrap.min.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link href="css/narrow-jumbotron.css" rel="stylesheet">
```
再次說一下,到下面這個網址把這兩個css文件下載下來(用瀏覽器的查看源代碼功能)。
<http://getbootstrap.com/docs/4.0/examples/narrow-jumbotron/>
下載后這兩個文件,都放到`public/css`目錄下,目錄結構如下:
```
public/css
├── bootstrap.min.css
└── narrow-jumbotron.css
```
## 5. 重在領悟
上面的各種 view,主要講到了三個指令,分別是 `@extends`、`@yield('body')`,`@section`。
`@extends` 簡單,主要是在 `子view` 中用,表示要去使用哪個 layout。
`@yield('body')` 是在 layout 中用,有點像在埋一個點,等著子 view 來放真正的內容,而 `@section` 才是子 view 真正放內容的地方。
如果不理解,多結合上面的例子看看吧,反正我是一下子就理解的。
完結。
下一篇:[Ruby 程序員學習 laravel 框架筆記 (11)-使用 @include 來整理 view](https://www.rails365.net/articles/ruby-cheng-xu-yuan-xue-xi-laravel-kuang-jia-bi-ji-11-shi-yong-include-lai-zheng-li-view)
- 0. 介紹
- 1. php 開發環境安裝
- 2. 跑 laravel 的 hello world
- 3. 第一個路由 UsersController
- 4. 在數據庫中創建一條數據
- 5. 簡單的用戶認證
- 6. 修改 User model
- 7. User model 的 getter 方法
- 8. view 的更多知識
- 9. 在 view 中共享變量
- 10. blade layout
- 11. 使用 @include 來整理 view
- 12. Blade if/else/unless/or
- 13. factories, faker and seeding
- 14. Blade foreach
- 15. 分頁
- 16. 用中間件來限制用戶必須登錄
- 17. Route group
- 18. CURD 實踐之改變用戶表結構
- 19. CURD 實踐之為新添加的屬性修改注冊功能
- 20. CURD 實踐之用 username 來代替 email 登錄
- 21. CURD 個人中心頁面
- VIM 的 laravel 插件
- VIM 中有效地查看 php 源碼