配置路由
当用户在查看一个网页时,一个完整的访问过程如下:
- 打开浏览器在地址栏输入 URL 并访问;
- 路由将 URL 请求映射到指定控制器上;
- 控制器收到请求,开始进行处理。如果视图需要动态数据进行渲染,则控制器会开始从模型中读取数据;
- 数据读取完毕,将数据传送给视图进行渲染;
- 视图渲染完成,在浏览器上呈现出完整页面;
如下图:
开发页面时,最开始最重要的事情就是处理好网页路由的关系
routes/web.php
<?php
Route::get('/', 'StaticPagesController@home');
Route::get('/help', 'StaticPagesController@help');
Route::get('/about', 'StaticPagesController@about');
生成控制器
Laravel 的控制器命名规范统一使用 驼峰式大小写 和复数形式来命名,在这里我们也应该这么做。一般情况下,我们会使用下面命令来生成静态页面控制器:
$ php artisan make:controller StaticPagesController
让我们来看下StaticPagesController文件生成的默认代码:
app/Http/Controllers/StaticPagesController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class StaticPagesControlle extends Controller
{
//
}
现在的静态页面控制器中还没有指定好三个页面对应的动作,让我们来为控制器加上这三个动作来处理从路由发过来的请求:
app/Http/Controllers/StaticPagesController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class StaticPagesController extends Controller
{
public function home()
{
return '主页';
}
public function help()
{
return '帮助页';
}
public function about()
{
return '关于页';
}
}
添加静态页面视图
要在控制器中指定渲染某个视图,则需要使用到view方法,view方法接收两个参数,第一个参数是视图的路径名称,第二个参数是与视图绑定的数据,第二个参数为可选参数。
app/Http/Controllers/StaticPagesController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class StaticPagesController extends Controller
{
public function home()
{
return view('static_pages/home');
}
public function help()
{
return view('static_pages/help');
}
public function about()
{
return view('static_pages/about');
}
}
下面这行代码,将会渲染在resources/views/static_pages/home.blade.php文件。
默认情况下,所有的视图文件都存放在resources/views文件夹下。
return view('static_pages/home');
在控制器中指定渲染的视图之后,接下来便是对视图进行构建了,我们需要在resources/views中新增下面三个视图。
resources/views/static_pages/home.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Sample App</title>
</head>
<body>
<h1>主页</h1>
</body>
</html>
resources/views/static_pages/help.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Sample App</title>
</head>
<body>
<h1>帮助页</h1>
</body>
</html>
resources/views/static_pages/about.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Sample App</title>
</head>
<body>
<h1>关于页</h1>
</body>
</html>
Blade 模板引擎
细心的你可能会留意到这三个文件的后缀名均为.blade.php,而不是.php。这是因为 Blade 是 Laravel 中提供的一套模板引擎,在 Blade 视图中我们可以使用 Laravel 为这套引擎定义的一些默认方法,并完全兼容 PHP 语法的书写。在项目运行时,Laravel 会把所有的 Blade 视图进行编译缓存成普通的 PHP 代码,因此你不必担心 Blade 会对应用产生负担。
使用通用视图
你可能已经注意到了,前面我们创建的几个视图里面包含着一些重复的代码,这明显违反了 DRY(Don't repeat yourself)原则,导致代码变得不够灵活、简洁。因此我们需要对页面进行重构,把多余的代码从视图中抽离出来,单独创建一个默认视图来进行存放通用代码。
我们给应用创建了一个 default 视图,并将其放在 layouts 文件夹中,default 视图将作为整个应用的基础视图。实际上你只要保证视图文件被放置在 resources/views 目录下即可,Laravel 对视图的文件夹和文件命名并没有限制,我将 default 文件放在 layouts 文件下,只是为了让应用的目录结构让人更好理解。
resources/views/layouts/default.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Sample App</title>
</head>
<body>
@yield('content')
</body>
</html>
下面的这行代码表示该占位区域将用于显示 content 区块的内容,而 content 区块的内容将由继承自 default 视图的子视图定义。
@yield('content')
Laravel 的 Blade 模板支持继承,这意味多个子视图可以共用父视图提供的视图模板。接下来让我们修改之前创建的首页视图文件,来学习下如何使用 Blade 模板的继承。
resources/views/static_pages/home.blade.php
@extends('layouts.default')
@section('content')
<h1>主页</h1>
@stop
接下来让我们对其它两个视图也进行更改,统一使用父视图的代码。
修改完成之后,再次在网页上访问这几个静态页面,你会发现父视图的代码已被成功嵌入到子视图中。
现在还有一点不足的地方,就是所有的网站标题名字都为 Sample,这可太没个性了。因此我们接下来要做的就是针对页面标题进行优化,让不同页面显示不同的标题。
首先我们要修改默认视图文件,在代码显示标题的位置嵌入 @yield 区块:
resources/views/layouts/default.blade.php
<!DOCTYPE html>
<html>
<head>
<title>@yield('title', 'Sample')</title>
</head>
<body>
@yield('content')
</body>
</html>
我们给 @yield 传了两个参数,第一个参数是该区块的变量名称,第二个参数是默认值,表示当指定变量的值为空值时,使用 Sample 来作为默认值。
<title>@yield('title', 'Sample')</title>
下面让我们来为帮助页和关于页加上指定标题。
resources/views/static_pages/help.blade.php
@extends('layouts.default')
@section('title', '帮助')
@section('content')
<h1>帮助页</h1>
@stop
resources/views/static_pages/about.blade.php
@extends('layouts.default')
@section('title', '关于')
@section('content')
<h1>关于页</h1>
@stop
