laravel 学习指南 第三章
- TOC
{:toc}
3. 跟随快速入门
开始前先创建一个新的数据库,并添加到.env
文件中。
3.1 创建quickstart项目
3.1.1 使用composer
$ composer create-project laravel/laravel quickstart --prefer-dist
3.1.2 克隆整个快速入门文档
$ git clone https://github.com/laravel/quickstart-basic quickstart
$ cd quickstart
$ composer install
$ php artisan migrate
3.2 准备数据库
laravel有一种简单的定义与修改数据表的方法。
现在使用make:migration
生成tasks
新的数据表:
$ php artisan make:migration create_tasks_table --create=tasks
make:migration
自动添加了id
与时间戳
。
手动增加一个条码:
1 | $table->string('name'); |
随后使用下方命令将tasks
写入数据表。
$ php artisan migrate
注意:如果数据库中以及存在tasks
数据表,会报错。
3.3 Eloquent ORM模型
laravel 使用默认ORM是Eloquent,[ORM:物件关联对应],每一个Eloquent模型都有一个对应的数据表。
所有创建tasks
对应的Task
模型,使用Artisan
命令来生成模型。
$ php artisan make:model Task
模型在app
目录下,默认情况下,模型类是空的。不需要说明Eloquent模型要对应哪张数据表,它会假设数据表是模型的复数形态。
这里Task
对应的是tasks
。
3.4 路由
3.4.1 建置路由
默认情况下,所有的路由都定义在app/Http/routes.php
这个需要至少三个路由:显示所有任务的路由,添加新任务的路由,以及删除己存在任务的路由。
下面再app/Http/routse.php
中创建这三个路由。
1 |
|
3.4.2 显示视图
laravel的全部,HTML模板都存放在resources/view
目录下,使用view
函数从路由中返回一个模板。
1 | Route::get('/', function () { |
现在要在创建一个对应的视图模板resources/views/tasks.blade.php
作为View
对象。
3.5 创建布局&视图
下图中使用了Bootstrap CSS
样式
3.5.1 定义布局
几乎所有的web应用都在不同的页面中共享同一个布局。
例如,这个应用在视图顶部的导航条,这个导航条在每个页面都会出现。
laravel通过在每个页面中使用Blade布局让共享这些公共特性变得简单。
在resources/views/layouts/app.blade.php
中定义一个新布局,.blade.php
表明使用Blade模板引擎来渲染视图。
也可以使用PHP原生模板然而,Blade提供的标签语法可以编写简洁的模板。
app.blade.php
的内容如下:
1 | // resources/views/layouts/app.blade.php |
布局中的@yield('content')
部分,是一个Blade指令,用于指定继承布局的子页面,在这里可以注入自己的内容。
3.5.2 定义子视图
现在定义resources/views/tasks.blade.php
视图。Bootstrap CSS
的样本文件可以到github下载
tasks.blade.php
内容如下:
1 | //resources/views/tasks.blade.php |
注意:
使用@extends
告诉Blade要使用在resources/views/layouts/app.blade.php
的布局。
在@section('content')
与@endsection
之间的内容会被注入到app.blade.php
的@yield('contents')
位置。
@include('common.errors')
指令将会加载resources/views/common/errors.blade.php
中的内容,目前还没有定义。
现在可以设置路由:
1 | Route::get('/', function () { |
3.6 添加任务
3.6.1 验证
验证表单,在POST /task
路由中编写代码,处理表单请求,我们需要验证表单输入,然后才能创建一个新任务。
对这个表单而言,将name
字段设置为必填项,而长度不超过255个字符。如果表单验证失败,将会跳转到前一个页面,并将错误信息存入一次性的Session
中:
1 | Route::post('/task', function (Request $request) { |
$errors
->withErrors($validator)
将验证错误信息存放在一次性的session中,以便视图通过$errors
访问。
errors.blade.php
文件
1 | // resources/views/common/errors.blade.php |
注意:
errors
变量可用于每个laravel的视图中。如果没有验证错误信息存在,那么他就是一个空的ViewErroeBag
实例。
3.6.2 创建任务
接下来开始创建一个新任务。一旦新任务创建成功,页面会跳转到/
。要创建任务,可以有Eloquent
模式提供的save
方法:
1 | Route::post('/task', function (Request $request) { |
3.6.3 显示己存在的任务
添加代码到视图来显示所有任务列表。
需要编辑/路由传递所有已存在任务到视图,view函数接收一个数组作为第二个参数,我们可以将数据通过该数组传递到视图中:
1 | Route::get('/', function () { |
数据被传递到视图后,我们可以在tasks.blade.php
中以表格形式显示所有任务。Blade中使用@foreach
处理循环数据:
1 | @extends('layouts.app') |
3.7 删除任务
3.7.1 添加删除按钮
我们在tasks.blade.php
视图中留了一个“TODO”注释用于放置删除按钮。当删除按钮被点击时,DELETE /task
请求被发送到应用后台:
1 | <tr> |
方法伪造
尽管我们使用的路由是Route::delete
,但我们在删除按钮表单中使用的请求方法为POST
,HTML表单只支持GET
和POST
两种请求方式,因此我们需要使用某种方式来伪造DELETE请求。
我们可以在表单中通过输出method_field('DELETE')
来伪造DELETE
请求,该函数生成一个隐藏的表单输入框,然后Laravel识别出该输入并使用其值覆盖实际的HTTP请求方法。生成的输入框如下:
3.7.2 删除任务
最后,让我们添加业务逻辑到路由中执行删除操作,我们可以使用Eloquent
提供的findOrFail
方法从数据库通过ID获取模型实例,如果不存在则抛出404异常。获取到模型后,我们使用模型的delete
方法删除该模型在数据库中对应的记录。记录被删除后,跳转到/
页面:
1 | Route::delete('/task/{id}', function ($id) { |