用戶注冊(cè)頁(yè)面的實(shí)現(xiàn)
- 創(chuàng)建控制器
php artisan make:controller UserController
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
/**
* 注冊(cè)頁(yè)面
*/
public function register() {
// 渲染試圖杨名, 去找 /resources/views/user/register.blade.php
return view('user.register');
}
}
- 創(chuàng)建視圖 /resources/views/user/register.blade.php
{{-- 繼承第一天的布局模板 --}}
@extends('layouts.master')
{{-- 填補(bǔ)站位符输吏, @section(參數(shù)) 參數(shù)對(duì)應(yīng) @yeild(參數(shù)) --}}
@section('title', '主頁(yè)')
@section('content')
<div class="container">
這是注冊(cè)頁(yè)面
</div>
@endsection
- 創(chuàng)建一條路由并且在導(dǎo)航上使用它
# /routes/web.php
// 用戶功能實(shí)現(xiàn)學(xué)習(xí) 相關(guān)路由配置
Route::get('register', 'UserController@register')->name('register');
# nav.blade.php
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
{{-- 這里是 brand --}}
<a class="navbar-brand" href="#">Laravel5.6學(xué)習(xí)</a>
{{-- 這是里 小屏幕的菜單開關(guān) --}}
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbar">
<span class="navbar-toggler-icon"></span>
</button>
{{-- 這是 導(dǎo)航菜單:這些鏈接會(huì)在大屏幕平鋪展開, 而在小屏幕由上面的開關(guān)打開 --}}
<div class="collapse navbar-collapse" id="navbar">
{{-- 只要給 ul 一個(gè) .mr-auto 類,他就能在大屏幕下將下面的 div 頂向屏幕最右邊 --}}
<ul class="navbar-nav mr-auto">
<li class="nav-item"><a class="nav-link" href=" {{ route('test.home') }} ">主頁(yè)</a></li>
<li class="nav-item"><a class="nav-link" href=" {{ route('test.lists') }} ">列表</a></li>
<li class="nav-item"><a class="nav-link" href=" {{ route('test.show') }} ">詳情</a></li>
<li class="nav-item"><a class="nav-link disabled" href="#">不可用</a></li>
</ul>
<div>
<a href="" class="btn btn-outline-primary">登錄</a>
<a href=" {{ route('register') }} " class="btn btn-outline-success">注冊(cè)</a>
</idv>
</div>
</nav>
migrations 數(shù)據(jù)遷移
- 數(shù)據(jù)遷移文件位于 /database/migrations/ 下
- 數(shù)據(jù)遷移的主要作用就是對(duì)項(xiàng)目所用數(shù)據(jù)庫(kù)進(jìn)行版本管理,它可以定義表結(jié)構(gòu),修改表結(jié)構(gòu),并支持對(duì)上面兩種操作進(jìn)行回滾。( up() 方法創(chuàng)建/修改表卒废, down() 方法執(zhí)行相應(yīng)的回滾操作 )
- 來(lái)看看 /database/migrations/ 下自帶的兩個(gè)遷移文件
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
// ::create('user數(shù)據(jù)表', 然后調(diào)用一個(gè)閉包去編輯表結(jié)構(gòu))
Schema::create('users', function (Blueprint $table) {
// 一般來(lái)說(shuō) “increments = int primary key auto_increment” 即主鍵
$table->increments('id');
// 這個(gè)是創(chuàng)建 varchar 類型的 `name` 字段,默認(rèn) varchar 長(zhǎng)度為255
$table->string('name');
// 這個(gè)是創(chuàng)建 email , 并添加唯一約束
$table->string('email')->unique();
$table->string('password');
// 是否記住我 字段
$table->rememberToken();
// 這會(huì)創(chuàng)建 2個(gè)字段: 創(chuàng)建時(shí)間created_time 更新時(shí)間updated_time
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// 這句話的意思是 DROP DATABASE IF EXISTS 'users'
Schema::dropIfExists('users');
}
}
-
使用上面的遷移文件創(chuàng)建數(shù)據(jù)表
- 在 mysql 中創(chuàng)建數(shù)據(jù)庫(kù)宙地, 創(chuàng)建用戶
CREATE DATABASE `laravelStudy` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE USER `laravelStudy`@`localhost` IDENTIFIED BY 'laravelStudy'; GRANT ALL ON `laravelStudy`.* TO `laravelStudy`@`localhost`;
- 在 /.env 中配置數(shù)據(jù)庫(kù)相關(guān)信息
# 數(shù)據(jù)庫(kù) 軟件名 DB_CONNECTION=mysql # ip 地址 DB_HOST=127.0.0.1 # 端口號(hào) DB_PORT=3306 # 數(shù)據(jù)庫(kù)名 用戶名 密碼 DB_DATABASE=laravelStudy DB_USERNAME=laravelStudy DB_PASSWORD=laravelStudy
- “執(zhí)行遷移”
php artisan migrate
命令行提示: Migration table created successfully.
-
具體發(fā)生了什么:
- 根據(jù) 兩個(gè)遷移文件的 up()方法 幫我們生成了2張數(shù)據(jù)表
- 同時(shí)還生成了一個(gè) migrations 表摔认,可以看到這張表里記錄了上面新生成兩張表的遷移文件名稱,以及批次 “batch” 最重要的就是這張表里的 “batch” 字段宅粥,這兩張表的 batch = 1 ,說(shuō)明他們是我們第一次執(zhí)行
php artisan migrate
命令時(shí)生成的表参袱,那么下次我們?cè)賱?chuàng)建遷移文件對(duì)數(shù)據(jù)表的結(jié)構(gòu)進(jìn)行修改時(shí),它將再次在 migrations 表中插入新數(shù)據(jù),而那時(shí)的 batch = 2抹蚀。 如果我們會(huì)滾剿牺,則會(huì)會(huì)滾 batch 值最大的遷移文件的 down() 方法。
試試回滾命令
php artisan migrate:rollback
=> 執(zhí)行了 down() 方法
模型
- laravel中的模型是通過 “ORM對(duì)象關(guān)系映射” 映射到數(shù)據(jù)庫(kù)中的 => 可以說(shuō)一個(gè)模型對(duì)應(yīng)一張數(shù)據(jù)表环壤。
- 模型一般直接放在 /app/ 下晒来, 上面提到laravel 給我們默認(rèn)提供了關(guān)于 users 的遷移文件, 它自然也給我們創(chuàng)建了一個(gè)模型 User.php ( laravel中默認(rèn) Model模型 必須是 首字母大寫單數(shù)形式 => models數(shù)據(jù)表得 必須是 全小寫復(fù)數(shù)形式 )
- 創(chuàng)建一個(gè)模型
php artisan make:model Article -m
=> 創(chuàng)建一個(gè)模型 Article 同時(shí) -m 創(chuàng)建一個(gè) 遷移文件 (在該模型沒有對(duì)應(yīng)數(shù)據(jù)表的時(shí)候用這個(gè)命令) - 打開 /app/Article.php 模型
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
// 默認(rèn) Article模型 對(duì)應(yīng) articles表 郑现,當(dāng)然你也可以自己指定湃崩。 (不建議)
// protected $table = "articles";
}
tinker 模式測(cè)試代碼
- 進(jìn)入 tinker 模式
php artisan tinker
=> 命令提示符變?yōu)?>>>
則進(jìn)入了 tinker 模式 - 來(lái)玩一玩 App\User
# 引用 User 模型
use App\User
# 以下代碼使用的方法都是模型類可以使用的靜態(tài)方法
# 插入 幾條 數(shù)據(jù)
User::create(['name'=>'laravelStudy', 'email'=>'example@test.com', 'password'=>bcrypt('laravelStudy')]);
# 查詢所有數(shù)據(jù)
User::all();
# 查詢第一條數(shù)據(jù)
User::first();
# 根據(jù) 主鍵id 獲取數(shù)據(jù)
User::find(1);
# 實(shí)例化對(duì)象
$user = User::first(); //將 users 表中的第一條數(shù)據(jù)以對(duì)象的形式映射到變量$user中
# 通過對(duì)象設(shè)置字段的值,并且更新數(shù)據(jù)
$user->name = 'laravelStudy_tinker'; //設(shè)置對(duì)象的屬性 等同于 給字段設(shè)置新的值
$user->save(); //保存生效
# 通過 update() 方法一次修改多個(gè)字段
$user->update(['name'=>'laravelStudy', 'email'=>'ILoveLaravel@haha.com']);
- 總結(jié): tinker 可以幫助我們?cè)诿钚兄羞\(yùn)行 php 代碼接箫, 主要用于測(cè)試攒读, 可以讓我們不需要在控制器或者模型中寫一些測(cè)試代碼,測(cè)試完成后又去刪除或者注釋代碼辛友。
帶參數(shù)的路由
- 編輯 UserController 新建一個(gè) show() 方法
public function show($user) {
// dd => dump & die => 打印數(shù)據(jù)薄扁,終止程序
dd($user);
}
- 學(xué)習(xí)在配置路由時(shí)給路由綁定參數(shù) /routes/web.php
Route::get('user/show/{user}', 'UserController@show')->name('user.show'); //uri 為 '.../user/show/必傳參數(shù)$user'
注意 路有中的 {user} 對(duì)應(yīng) 控制器方法中的參數(shù) ($user) 。你換個(gè)名字就找不到了
- 如何訪問瞎领?
http://www.laravelstudy.com/user/show/ => 找不到網(wǎng)頁(yè) (因?yàn)槁酚膳渲弥?{參數(shù)} 即必傳參)
http://www.laravelstudy.com/user/show/test => 網(wǎng)頁(yè)顯示 "laravelStudy"
- 體會(huì) “依賴注入” 的便利 UserController
...
use App\User; // 引用 User 模型
...
// 在參數(shù)列表中以 “依賴注入 DI” 的形式實(shí)例化一個(gè) User 對(duì)象
public function show(User $user) {
// dd => dump & die => 打印數(shù)據(jù)泌辫,終止程序
dd($user);
}
資源路由
- RESTful設(shè)計(jì)原則的概念
把數(shù)據(jù)看成一個(gè)資源随夸, 我們的后臺(tái)編程無(wú)非是對(duì)數(shù)據(jù)進(jìn)行 “花式 CURD 增刪改查”九默。
- 創(chuàng)建一條資源路由 /routes/web.php
php artisan make:controller ArticleController --resource
// 資源路由 ('路由前綴', '資源控制器');
Route::resource('article', 'ArticleController');
使用
php artisan route:list
查看路有列表 => 會(huì)發(fā)現(xiàn)路由多了關(guān)于 資源article 的 列表index 新增頁(yè)面create 保存插入store 顯示單條數(shù)據(jù)show 編輯頁(yè)面edit 更新update 刪除destroy 等多條路由 => 對(duì)應(yīng) ArticleController 下的多個(gè)隨著命令參數(shù)--resource
創(chuàng)建出來(lái)的多個(gè)方法。使用
php artisan make:controller ExampleUserController --resource --model=User
創(chuàng)建一個(gè)資源控制器宾毒,自帶 CURD 方法驼修,同時(shí)一些方法實(shí)現(xiàn)了依賴注入在參數(shù)列表中構(gòu)造 User對(duì)象 。-
完成 show() 方法根據(jù)id獲取數(shù)據(jù)并在視圖上顯示
- 刪除之前的UserController 诈铛, 新建一個(gè) restful控制器 并且在參數(shù)列表中完成依賴注入構(gòu)造
php artisan make:controller UserController --resource --model=User
- 更新 /routes/web.php 路由配置
# 把之前的用于學(xué)習(xí)的都干掉 ... Route::resource('user', 'UserController');
- 使用
php artisan route:list
可以查看當(dāng)前生效的路由乙各,或者路由是否有沖突(報(bào)錯(cuò))。 - 在 UserController 里完成 show()方法
public function show(User $user) //這里已經(jīng)通過依賴注入幫我們實(shí)例化了一個(gè)User對(duì)象 { return view('user.show', compact('user')); // view('視圖名', compact('向視圖傳遞變量')); }
- 完成視圖 /resources/views/user/show.blade.php
@extends('layouts.master') @section('title', '主頁(yè)') @section('content') <div class="container"> {{-- {{ $對(duì)象->屬性 }} --}} <p><small>用戶名:</small> {{ $user->name }} </p> <p><small>郵箱:</small> {{ $user->email }} </p> </div> @endsection
- 通過查看 route list 我們看到 指向 UserController@show 的路由是 GET動(dòng)作 的 user/{user}幢竹, 即訪問url為 '.../user/參數(shù)' => 訪問 '.../user/1' => 頁(yè)面顯示id為1的用戶的 用戶名 和 郵箱
- 刪除之前的UserController 诈铛, 新建一個(gè) restful控制器 并且在參數(shù)列表中完成依賴注入構(gòu)造
美化并組件化 show.blade.php
- 增加一條命名規(guī)則: /resources/views/ 下的頁(yè)面組件耳峦,我們統(tǒng)一放在 components/ 下。 且 components/ 下組件名都以 _ 開頭
- ../components/nav.blade.php 重命名為 _nav.blade.php焕毫, 記得在引用它的布局頁(yè)面 ../layouts/master.blade.php中改一下蹲坷,然后我們新建一個(gè) _userCard.blade.php
<div class="container">
<div class="card">
<div class="card-body">
<h5 class="card-title"> {{ $user->name }} </h5>
<p class="card-text">
<small>Email:</small>
{{ $user->email }}
</p>
</div>
</div>
</div>
- 在 ../user/show.blade.php 中使用該組件
@extends('layouts.master')
@section('title', '用戶信息')
@section('content')
<div class="container">
{{-- 導(dǎo)入組件 @include('組件名', ['導(dǎo)入變量' => 值]) --}}
@include('components._userCard', ['user'=>$user])
</div>
@endsection
- 導(dǎo)入組件時(shí),我們可以不寫第二參數(shù)邑飒,也可以顯示 user=>$user循签,但是我們可以多復(fù)制幾行
@include('components._userCard', ['user'=>$user])
, 然后可以發(fā)現(xiàn)頁(yè)面顯示了很多條一模一樣的數(shù)據(jù)疙咸。