我们使用Laravel项目的artisan命令行工具先启动一下项目
D:\software\wamp64\www\laravel5>php artisan serve
我们在开发web应用当中,通常都会从数据库取出数据,然后再将数据传给视图。那么如何向视图中传递变量呢?我们以之前建好的 SiteController 控制器来举例说明,并且设置访问根目录 路由到 SiteController控制器的 index方法。
Route::get('/', 'SiteController@index');
在Laravel中,向视图中传递变量 有下面几种常见的方法:
在 SiteController 控制器的index 方法中,使用with方法,把 $today变量的值复制给视图里面的 today变量:
$today = '今天是2018.7.8'; return view("sites.about")->with("today",$today);
这样的 with('today', $today) 中,第一个 'today' 就是key,第二个 $today 就是值,这样我们就可以在我们的 sites/about.blade.php 中输出这个变量了:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> cuikai about <?php echo $today; ?><br> cuikai about <?= $today; ?> </body> </html>
浏览器访问: http://localhost:8000/ 地址,即可看到输出变量
其实是三种方法,只是在使用 with 的时候,变量和数组略有不同
使用with()方法 输出变量到视图一:
$name = '<span style="color:red">Nxius</span>'; return view('sites.about')->with('name', $name);
使用with()方法 输出变量到视图二:
在传递的数组中:每一个key会在视图中作为变量,而 value 就作为变量的值。
$today = '今天是2018.7.8'; return view("sites.about")->with([ 'first' => 'April', 'last' => 'Nixus', 'today' => $today ]);
输出变量到视图三:
$data = []; $data['first'] = 'Nixus'; $data['last'] = 'April'; $data['today'] = $today; return view('sites.about', $data);
使用compact()方法输出变量到视图四:
compact() 的字符串可以就是变量的名字,多个变量名用逗号隔开。这个时候注意更改视图的变量输出。
$first = 'April Again'; $last = 'Nixus Again'; $today = '<span style="color:red">今天是2018.7.8</span>'; return view('sites.about', compact('first', 'last', 'today'));
2、Blade模板引擎的用法
Laravel里的视图依赖于 Blade 这个模板引擎,如何使用Blade模板引擎来输出变量呢?两个花括号 {{ }}
cuikai about {{ $today }}<br> {{ $first }}
需要注意的是:使用{{}}会自动使用php中的htmlspecialchars方法来转义成实体。
其实在blade引擎中, {{ $today }} 会被解析为类似 这样的输出 <?php echo $today ; ?> ,不过这里的{{ }} 符号会将数据原样输出,比如你将 $today写成这样:
$today = '<span style="color:red">今天是2018.7.8</span>'; return view("sites.about")->with("today", $today);
然后在前端使用 {!! $today !!} 来输出变量,会看到类似下面这样:
cuikai about {!! $today !!}<br>
向视图传递变量大概就是如此了。。。
再说一下Blade模板的基本用法:
上面的内容介绍了一点点blade的语法,这里我们再统一介绍blade,说说下面几个比较常用的:
@yield()
@extends()
@if() and @unless()
@foreach()
@yield() 和 @extends() 通常会结合者使用,实现我们通常所说的layouts布局:就是在web开发的过程中,我们将一些公用的部分如 header , footer 等直接放在一个视图文件中,然后在使用的使用直接继承(使用@extends) 就可以了,比如我们在 resources/views/ 文件夹之下创建一个 app.blade.php :
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> <title>Laravel 5 教程</title> <link rel='stylesheet' href="/css/all.css" type='text/css' media='all'/> <script type='text/javascript' src="/js/all.js"></script> </head> <body> <div id="wrapper"> @yield('content') <nav class="nav-container group" id="nav-footer"> <div> <ul class="nav container group"> <li> <a href="/" rel="nofollow" target="_blank">Laravel 5 Blog</a> </li> </ul> </div> </nav> </div> </body> </html>
写上这么一些内容,其中css这个 href="/css/all.css" ,需要我们手动在 public/ 文件夹之下创建css/文件夹,并创建all.css这个文件,对于js的src="/js/all.js"也是同理,这两个文件是为了后面的页面美化而做的提前准备。
注意到@yield('content')这个语法,这里就是说,这里有一个content的内容区域,如果某个页面继承了这个app.blade.php,然后那个页面就可以动态改变@yield('content')的内容了。比如我们在articles/lists.blade.php中,我们继承一下app.blade.php:
@extends('app') @section('content') <h1>{!! $title !!}</h1> <p>{{ $intro }}</p> @endsection
这里的第一行@extends('app')就是声明这个页面继承于app.blade.php,也就是我们的articles/lists.blade.php可以使用到all.css和all.js文件,然后@section('content')就是对于app.blade.php的@yield('content'),表明就是:在渲染加载articles/lists.blade.php的时候,@yield('content')这部分内容会被替换为下面的内容:
<h1>{!! $title !!}</h1> <p>{{ $intro }}</p>
@if()通常是用于在视图中根据某些条件来判断是否该显示某些内容,比如我们可以很“无聊”地试试这样:
public function index() { $first = 'jelly'; $last = 'bool'; return view('articles.lists',compact('first','last')); }
在views文件中,我们使用一下@if():
@extends('app') @section('content') @if($first == 'jellybool') <h1>{{ $first }}</h1> @else <h1>{{ $last }}</h1> @endif @endsection
上面的@if(),还有一个可以使用的标签就是@unless(),@unless()就可以理解为 if( ! ),就是if not 这样理解就OK。
@foreach()用于循环输出变量,比如:
public function index() { $first = ['jelly','bool']; return view('articles.lists',compact('first')); }
我们传一个数组给视图,然后,我们就可以使用@foreach()循环输出了:
@extends('app') @section('content') @foreach( $first as $name) <h1> {{ $name }}</h1> @endforeach @endsection
本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn