目錄
1、简介
2、安装
3、准备好数据库
3.1 数据库迁移
3.2 Eloquent模型
4、路由
4.1 路由存根
4.2 显示视图
5、创建布局&视图
5.1 定义布局
5.2 定义子视图
6、添加任务
6.1 验证
6.2 创建任务
6.3 显示已存在的任务
7.2 删除任务
7.1 添加删除按钮
首頁 後端開發 php教程 [ Laravel 5.2 文档 ] 新手入门指南 -- 简单任务管理系统

[ Laravel 5.2 文档 ] 新手入门指南 -- 简单任务管理系统

Jun 23, 2016 pm 01:16 PM

1、简介

快速 入门指南 会对Laravel框架做一个基本介绍,包括数据库迁移、Eloquent ORM、路由、 验证 、 视图 以及Blade模板等等。如果你是个Laravel新手甚至之前对PHP框架也很陌生,那么这里将会成为你的良好起点。如果你已经使用过Laravel获取其它PHP框架,可以考虑跳转到进阶指南(翻译中)。

为了演示Laravel特性的基本使用,我们将将会构建一个简单的、用于追踪所有要完成任务的任务列表(To-Do List),本教程完整的代码已经公开在Github上: https://github.com/laravel/quickstart-basic 。

2、安装

安装Laravel

当然,开始之前你首先要做的是安装一个新的Laravel应用。你可以使用Homestead虚拟机或者本地PHP开发环境来运行应用。设置好开发环境后,可以使用如下Composer命令安装应用:

composer create-project laravel/laravel quickstart --prefer-dist
登入後複製

安装Quickstart项目

当然你还可以通过克隆GitHub仓库到本地来安装:

git clone https://github.com/laravel/quickstart-basic quickstartcd quickstartcomposer installphp artisan migrate
登入後複製

如果你还不了解如何构建本地开发环境,可参考Homestead和 安装 文档 。

3、准备好数据库

3.1 数据库迁移

首先,让我们使用迁移来定义数据表用于处理所有任务。Laravel的数据库迁移特性提供了一个简单的方式来对数据表结构进行定义和修改:不需要让团队的每个成员添加列到本地数据库,只需要简单运行你提交到源码控制中的迁移即可实现数据表创建及修改。

那么,让我们来创建这个处理所有任务的数据表吧。Artisan命令可以用来生成多种类从而节省重复的劳动,在本例中,我们使用 make:migration 命令生成 tasks 对应的数据表迁移:

php artisan make:migration create_tasks_table --create=tasks
登入後複製

该命令生成的迁移文件位于项目根目录下的 database/migrations 目录,可能你已经注意到了, make:migration 命令已经在迁移文件中为我们添加了自增ID和时间戳,接下来我们要编辑该文件添加更多的列到数据表 tasks :

<?phpuse Illuminate\Database\Schema\Blueprint;use Illuminate\Database\Migrations\Migration;class CreateTasksTable extends Migration{    /**     * Run the migrations.     *     * @return void     */    public function up()    {        Schema::create('tasks', function (Blueprint $table) {            $table->increments('id');            $table->string('name');            $table->timestamps();        });    }    /**     * Reverse the migrations.     *     * @return void     */    public function down()    {        Schema::drop('tasks');    }}
登入後複製

要运行迁移,可以使用Artisan命令 migrate 。如果你使用的是Homestead,应该在虚拟机中运行该命令:

php artisan migrate
登入後複製

该命令会为我们创建迁移文件中定义的所有数据表,如果你使用数据库客户端软件查看数据库,可以看到已经创建了一个新的 tasks 表,其中包含了我们在迁移中定义的列。接下来,我们准备为这个数据表定义一个Eloquent ORM模型。

3.2 Eloquent模型

Laravel使用的默认ORM是Eloquent,Eloquent使用模型让数据存取变得简单和轻松,通常,每一个Eloquent模型都有一个与之对应的数据表。

所以我们要定义一个与刚刚创建的 tasks 表对应的 Task 模型,同样我们使用Artisan命令来生成这个模型:

php artisan make:model Task
登入後複製

该模型类位于 app 目录下,默认情况下,模型类是空的,我们不需要告诉该Eloquent模型对应哪张数据表,这一点我们在Eloquent 文档中提及过,这里默认对应的数据表是 tasks ,下面是这个空的模型类:

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Task extends Model{    //}
登入後複製

了解更多关于Eloquent模型类的细节,可查看完整的Eloquent文档。

4、路由

4.1 路由存根

下面我们需要为应用定义一些路由,路由的作用是在用户访问指定页面时将页面URL匹配到被执行的控制器或匿名函数。默认情况下,所有的Laravel路由都定义在 app/Http/routes.php 。

在本应用中,我们需要至少三个路由:显示所有任务的路由,添加新任务的路由,以及删除已存在任务的路由。接下来,让我们在 app/Http/routes.php 文件中创建这三个路由:

<?phpuse App\Task;use Illuminate\Http\Request;/** * Display All Tasks */Route::get('/', function () {   //});/** * Add A New Task */Route::post('/task', function (Request $request) {    //});/** * Delete An Existing Task */Route::delete('/task/{id}', function ($id) {    //});
登入後複製

4.2 显示视图

接下来,我们来填充 / 路由,在这个路由中,我们要渲染一个HTML模板,该模板包含添加新任务的表单,以及显示任务列表。

在Laravel中,所有的HTML模板都存放在 resources/views 目录下,我们可以使用 view 函数从路由中返回其中一个模板:

Route::get(‘/’, function () {

return view(‘tasks’);

});

传递tasks到view函数将会创建一个对应视图模板为 resources/views/tasks.blade.php的View对象。接下来我们需要去创建这个视图文件。

5、创建布局&视图

本应用为了简单处理只包含一个视图,其中包含了添加新任务的表单和所有任务的列表。为了让大家有一个直观的视觉效果,我们贴出该视图的截图,可以看到我们在视图中使用了基本的Bootstrap CSS样式:

5.1 定义布局

几乎所有的web应用都是在不同页面中共享同一个布局,例如,本应用在视图顶部有一个导航条,该导航条在每个页面都会出现。Laravel通过在每个页面中使用Blade布局让共享这些公共特性变得简单。

正如我们之前讨论的,所有Laravel视图都存放在 resources/views 中,因此,我们在 resources/views/layouts/app.blade.php 中定义一个新的布局视图, .blade.php 扩展表明框架使用Blade模板引擎来渲染视图,当然,你可以使用原生的PHP模板,然而,Blade提供了的标签语法可以帮助我们编写更加清爽、简短的模板。

编辑 app.blade.php 内容如下:

// resources/views/layouts/app.blade.php<!DOCTYPE html><html lang="en">    <head>        <title>Laravel Quickstart - Basic</title>        <!-- CSS And JavaScript -->    </head>    <body>        <div class="container">            <nav class="navbar navbar-default">                <!-- Navbar Contents -->            </nav>        </div>        @yield('content')    </body></html>
登入後複製

注意布局中的 @yield('content') 部分,这是一个Blade指令,用于指定继承布局的子页面在这里可以注入自己的内容。接下来,我们来定义使用该布局的子视图来提供主体内容。

5.2 定义子视图

好了,我们已经创建了应用的布局视图,下面我们需要定义一个包含创建新任务的表单和已存在任务列表的视图,该视图文件存放在 resources/views/tasks.blade.php 。

我们将跳过Bootstrap CSS的样板文件而只专注在我们所关注的事情上,不要忘了,你可以从 GitHub 下载本应用的所有资源:

//resources/views/tasks.blade.php@extends('layouts.app')@section('content')    <!-- Bootstrap Boilerplate... -->    <div class="panel-body">        <!-- Display Validation Errors -->        @include('common.errors')        <!-- New Task Form -->        <form action="/task" method="POST" class="form-horizontal">            {{ csrf_field() }}            <!-- Task Name -->            <div class="form-group">                <label for="task" class="col-sm-3 control-label">Task</label>                <div class="col-sm-6">                    <input type="text" name="name" id="task-name" class="form-control">                </div>            </div>            <!-- Add Task Button -->            <div class="form-group">                <div class="col-sm-offset-3 col-sm-6">                    <button type="submit" class="btn btn-default">                        <i class="fa fa-plus"></i> Add Task                    </button>                </div>            </div>        </form>    </div>    <!-- TODO: Current Tasks -->@endsection
登入後複製

一些需要注意的事项

在继续往下之前,让我们简单谈谈这个模板。首先,我们使用 @extends 指令告诉Blade我们要使用定义在 resources/views/layouts/app.blade.php 的布局,所有 @section('content') 和 @endsection 之间的内容将会被注入到 app.blade.php 布局的 @yield('contents') 指令位置。

现在,我们已经为应用定义了基本的布局和视图,接下来,我们准备添加代码到 POST /task 路由来处理添加新任务到数据库。

@include('common.errors') 指令将会加载 resources/views/common/errors.blade.php 模板中的内容,我们还没有定义这个模板,但很快就会了!

现在我们为应用定义了基本布局和视图文件,现在我们回到/路由:

Route::get('/', function () {    return view('tasks');});
登入後複製

接下来,我们准备添加代码到 POST /task 路由以便处理输入并添加新任务到数据库。

6、添加任务

6.1 验证

现在我们已经在视图中定义了表单,接下来需要在POST /task路由中编写代码处理表单请求,我们需要验证表单输入,然后才能创建一个新任务。

对这个表单而言,我们将 name 字段设置为必填项,而且长度不能超过255个字符。如果表单验证失败,将会跳转到前一个页面,并且将错误信息存放到一次性Session中:

Route::post('/task', function (Request $request) {    $validator = Validator::make($request->all(), [        'name' => 'required|max:255',    ]);    if ($validator->fails()) {        return redirect('/')            ->withInput()            ->withErrors($validator);    }    // Create The Task...});
登入後複製

$errors变量

让我们停下来讨论下上述代码中的 ->withErrors($validator) 部分, ->withErrors($validator) 会将验证错误信息存放到一次性session中,以便在视图中可以通过 $errors 变量访问。

我们在视图中使用了 @include('common.errors') 指令来渲染表单验证错误信息, common.errors 允许我们在所有页面以统一格式显示错误信息。我们定义 common.errors 内容如下:

// resources/views/common/errors.blade.php@if (count($errors) > 0)    <!-- Form Error List -->    <div class="alert alert-danger">        <strong>Whoops! Something went wrong!</strong>        <br><br>        <ul>            @foreach ($errors->all() as $error)                <li>{{ $error }}</li>            @endforeach        </ul>    </div>@endif
登入後複製

注: $errors 变量在每个Laravel视图中都可以访问,如果没有错误信息的话它就是一个空的 ViewErrorBag 实例。

6.2 创建任务

现在输入验证已经做好了,接下来正式开始创建一个新任务。一旦新任务创建成功,页面会跳转到 / 。要创建任务,可以使用Eloquent模型提供的 save 方法:

Route::post('/task', function (Request $request) {    $validator = Validator::make($request->all(), [        'name' => 'required|max:255',    ]);    if ($validator->fails()) {        return redirect('/')            ->withInput()            ->withErrors($validator);    }    $task = new Task;    $task->name = $request->name;    $task->save();    return redirect('/');});
登入後複製

好了,到了这里,我们已经可以成功创建任务,接下来,我们继续添加代码到视图来显示所有任务列表。

6.3 显示已存在的任务

首先,我们需要编辑 / 路由传递所有已存在任务到视图。 view 函数接收一个数组作为第二个参数,我们可以将数据通过该数组传递到视图中:

Route::get('/', function () {    $tasks = Task::orderBy('created_at', 'asc')->get();    return view('tasks', [        'tasks' => $tasks    ]);});
登入後複製

数据被传递到视图后,我们可以在 tasks.blade.php 中以表格形式显示所有任务。Blade中使用 @foreach 处理循环数据:

@extends('layouts.app')@section('content')    <!-- Create Task Form... -->    <!-- Current Tasks -->    @if (count($tasks) > 0)        <div class="panel panel-default">            <div class="panel-heading">                Current Tasks            </div>            <div class="panel-body">                <table class="table table-striped task-table">                    <!-- Table Headings -->                    <thead>                        <th>Task</th>                        <th> </th>                    </thead>                    <!-- Table Body -->                    <tbody>                    @foreach ($tasks as $task)                        <tr>                            <!-- Task Name -->                            <td class="table-text">                                <div>{{ $task->name }}</div>                            </td>                            <td>                                <!-- TODO: Delete Button -->                            </td>                        </tr>                    @endforeach                    </tbody>                </table>            </div>        </div>    @endif@endsection
登入後複製

至此,本应用基本完成。但是,当任务完成时我们还没有途径删除该任务,接下来我们就来处理这件事。

7、删除任务

7.1 添加删除按钮

我们在 tasks.blade.php 视图中留了一个“TODO”注释用于放置删除按钮。当删除按钮被点击时, DELETE /task 请求被发送到应用后台:

<tr>    <!-- Task Name -->    <td class="table-text">        <div>{{ $task->name }}</div>    </td>    <!-- Delete Button -->    <td>        <form action="/task/{{ $task->id }}" method="POST">            {{ csrf_field() }}            {{ method_field('DELETE') }}            <button>Delete Task</button>        </form>    </td></tr>
登入後複製

关于方法伪造

尽管我们使用的路由是 Route::delete ,但我们在删除按钮表单中使用的请求方法为 POST ,HTML表单只支持 GET 和 POST 两种请求方式,因此我们需要使用某种方式来伪造 DELETE 请求。

我们可以在表单中通过输出 method_field('DELETE') 来伪造 DELETE 请求,该函数生成一个隐藏的表单输入框,然后Laravel识别出该输入并使用其值覆盖实际的HTTP请求方法。生成的输入框如下:

<input type="hidden" name="_method" value="DELETE">
登入後複製

7.2 删除任务

最后,让我们添加业务逻辑到路由中执行删除操作,我们可以使用Eloquent提供的 findOrFail 方法从数据库通过ID获取模型实例,如果不存在则抛出404异常。获取到模型后,我们使用模型的 delete 方法删除该模型在数据库中对应的记录。记录被删除后,跳转到 / 页面:

Route::delete('/task/{id}', function ($id) {    Task::findOrFail($id)->delete();    return redirect('/');});
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

PHP 8.1中的枚舉(枚舉)是什麼? PHP 8.1中的枚舉(枚舉)是什麼? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚舉功能通過定義命名常量增強了代碼的清晰度和類型安全性。 1)枚舉可以是整數、字符串或對象,提高了代碼可讀性和類型安全性。 2)枚舉基於類,支持面向對象特性,如遍歷和反射。 3)枚舉可用於比較和賦值,確保類型安全。 4)枚舉支持添加方法,實現複雜邏輯。 5)嚴格類型檢查和錯誤處理可避免常見錯誤。 6)枚舉減少魔法值,提升可維護性,但需注意性能優化。

會話如何劫持工作,如何在PHP中減輕它? 會話如何劫持工作,如何在PHP中減輕它? Apr 06, 2025 am 12:02 AM

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

描述紮實的原則及其如何應用於PHP的開發。 描述紮實的原則及其如何應用於PHP的開發。 Apr 03, 2025 am 12:04 AM

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是REST API設計原理? 什麼是REST API設計原理? Apr 04, 2025 am 12:01 AM

RESTAPI設計原則包括資源定義、URI設計、HTTP方法使用、狀態碼使用、版本控制和HATEOAS。 1.資源應使用名詞表示並保持層次結構。 2.HTTP方法應符合其語義,如GET用於獲取資源。 3.狀態碼應正確使用,如404表示資源不存在。 4.版本控制可通過URI或頭部實現。 5.HATEOAS通過響應中的鏈接引導客戶端操作。

您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? 您如何在PHP中有效處理異常(嘗試,捕捉,最後,投擲)? Apr 05, 2025 am 12:03 AM

在PHP中,異常處理通過try,catch,finally,和throw關鍵字實現。 1)try塊包圍可能拋出異常的代碼;2)catch塊處理異常;3)finally塊確保代碼始終執行;4)throw用於手動拋出異常。這些機制幫助提升代碼的健壯性和可維護性。

PHP中的匿名類是什麼?您何時可以使用它們? PHP中的匿名類是什麼?您何時可以使用它們? Apr 04, 2025 am 12:02 AM

匿名類在PHP中的主要作用是創建一次性使用的對象。 1.匿名類允許在代碼中直接定義沒有名字的類,適用於臨時需求。 2.它們可以繼承類或實現接口,增加靈活性。 3.使用時需注意性能和代碼可讀性,避免重複定義相同的匿名類。

See all articles