Laravel 基礎(chǔ)學(xué)習(xí) 第二天

用戶注冊(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>&nbsp; {{ $user->name }} </p> 
        <p><small>郵箱:</small>&nbsp; {{ $user->email }} </p>
    </div>
    @endsection
    
    • 通過查看 route list 我們看到 指向 UserController@show 的路由是 GET動(dòng)作 的 user/{user}幢竹, 即訪問url為 '.../user/參數(shù)' => 訪問 '.../user/1' => 頁(yè)面顯示id為1的用戶的 用戶名 和 郵箱

美化并組件化 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> &nbsp;
                {{ $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ù)疙咸。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末县匠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乞旦,老刑警劉巖贼穆,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兰粉,居然都是意外死亡扮惦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門亲桦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崖蜜,“玉大人,你說(shuō)我怎么就攤上這事客峭≡チ欤” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵舔琅,是天一觀的道長(zhǎng)等恐。 經(jīng)常有香客問我,道長(zhǎng)备蚓,這世上最難降的妖魔是什么课蔬? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮郊尝,結(jié)果婚禮上二跋,老公的妹妹穿的比我還像新娘。我一直安慰自己流昏,他們只是感情好扎即,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著况凉,像睡著了一般谚鄙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刁绒,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天闷营,我揣著相機(jī)與錄音,去河邊找鬼知市。 笑死傻盟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的初狰。 我是一名探鬼主播莫杈,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼奢入!你這毒婦竟也來(lái)了筝闹?” 一聲冷哼從身側(cè)響起媳叨,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎关顷,沒想到半個(gè)月后糊秆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡议双,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年痘番,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片平痰。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汞舱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宗雇,到底是詐尸還是另有隱情昂芜,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布赔蒲,位于F島的核電站泌神,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舞虱。R本人自食惡果不足惜欢际,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望矾兜。 院中可真熱鬧损趋,春花似錦、人聲如沸焕刮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)配并。三九已至,卻和暖如春高镐,著一層夾襖步出監(jiān)牢的瞬間溉旋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工嫉髓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留观腊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓算行,卻偏偏與公主長(zhǎng)得像梧油,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子州邢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容