天天看點

Laravel基礎篇-路由、視圖、模型、Blade模闆

一、Laravel簡介

架構提供的功能:

1、資料庫DB

2、緩存Cache

3、會話Session

4、檔案上傳

流行架構的優點

文檔齊全

社群活躍

後期支援

Laravel簡介

1、簡潔,優雅

2、驗證,路由,session緩存,資料庫遷移功能,單元測試

版本選擇

長期支援 LTS Long Time support

二、環境配置

伺服器環境

$ php -v
PHP 7.1.23      

Laravel 5.8 要求:PHP >= 7.1.3

文檔:

https://laravel.com/docs/5.8

MVC資料互動

視圖View <-> 控制器Controller <-> 模型Model      

Mac MAMP

Win XAMPP

phpinfo.php

<?php

phpinfo();      

設定國内鏡像

# 檢視全局設定
composer config -gl

# 設定鏡像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

# 解除鏡像
composer config -g --unset repos.packagist
      

參考

國内的Composer全量鏡像彙總

建立項目

$ composer create-project laravel/laravel=5.8.* demo --prefer-dist
$ cd demo
$ php artisan --version
Laravel Framework 5.8.35

# 啟動服務
$ php artisan serve      

通路:

http://127.0.0.1:8000

整個檔案夾大小

Laravel Framework 5.8.35 32.8M

ThinkPHP_5.0.24_with_extend 5.6M

三、路由

1、路由簡介

路由将使用者的請求轉發給對應的程式進行處理

作用:建立url和程式之間的映射

請求類型:get、post、put、patch、delete

路由檔案:routes/web.php

2、基本路由

Route::get('hello', function () {
    return 'hello world';
});

Route::post('post', function () {
    return 'post';
});      

3、多請求路由

Route::match(['get', 'post'], 'match', function () {
    return 'match';
});

Route::any('any', function () {
    return 'any';
});      

4、路由參數

Route::get('detail/{id}', function ($id) {
    return 'detail-id: ' . $id ;
});

// 預設參數
Route::get('detail/{name?}', function ($name = null) {
    return 'detail-name: ' . $name ;
});

// 正則判斷參數類型
Route::get('detail/{id}', function ($id) {
    return 'detail-id: ' . $id ;
})->where('id', '\d+');

Route::get('detail/{name?}', function ($name = null) {
    return 'detail-name: ' . $name ;
})->where('name', '[A-Za-z]+');

// 多個參數校驗
Route::get('detail/{id}/{name?}', function ($id, $name = null) {
    return 'detail-id: ' . $id  . ' detail-name: ' . $name ;
})->where(['id' => '\d+', 'name' => '[A-Za-z]+']);
      

5、路由别名

Route::get('path', ['as'=>'alias', function(){
    return Route('alias');
}]);      

6、路由群組

Route::group(['prefix' => 'user'], function (){
   // 通路方式:user/name
   Route::get('name', function (){
       return 'user name';
   });

   // 通路方式:user/age
    Route::get('age', function (){
        return 'user age';
    });
});      

7、路由中輸出視圖

Route::get('/', function () {
    return view('welcome');
    // resources/views/welcome.blade.php
});      

四、控制器

路由隻接收請求,具體業務邏輯交由控制器處理

1、建立控制器

app/Http/Controllers/MemberController.php

namespace App\Http\Controllers;


class MemberController extends Controller
{
    function info(){
        return 'hello world';
    }
}
      

2、控制器和路由關聯

Route::get('member/info', 'MemberController@info');

// 或者
Route::get('member/info', ['uses' => 'MemberController@info']);
      

3、關聯控制器後,路由特性使用

// 别名
Route::get('member/info', [
    'uses' => 'MemberController@info',
    'as' => 'memberinfo'
]);
// 控制器中使用别名
// Route('memberinfo');

// 路由參數
Route::get('member/info/{id}', 'MemberController@info');
// 控制器接收參數
// function info($id){
//     return 'info:' . $id;
// }

// 驗證路由參數
Route::get('member/info/{id}', 'MemberController@info')
    ->where('id', '[0-9]+');
      

五、視圖

一個控制器對應一個目錄

1、建立視圖

如果要輸出變量,注意字尾為

blade.php

resources/views/member/info.blade.php

<h1>member info</h1>
name: {{$name}}
age: {{$age}}
      

2、輸出視圖

路由配置

Route::get('member/info', 'MemberController@info');      

控制器方法

class MemberController extends Controller
{
    function info(){
        $data = [
          'name' => 'Tom',
          'age' => 18
        ];

        return view('member/info', $data);
    }
}      

六、模型

1、建立模型

app/Member.php

namespace App;


use Illuminate\Database\Eloquent\Model;


class Member extends Model
{
   public static function getMember(){
       return [
           'name' => 'Tom',
           'age' => 18
       ];
   }
}
      

七、資料庫

Laravel提供3種操作資料庫方式

1、DB facade 原始查找

2、查詢構造器query builder

3、Eloquent ORM

八、DB facade 原始查找

1、建立資料表與連接配接資料庫

CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年齡',
  `sex` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '性别',
  `created_at` int(11) NOT NULL DEFAULT '0' COMMENT '建立時間',
  `updated_at` int(11) NOT NULL DEFAULT '0' COMMENT '修改時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='學生表'      

2、配置資料連接配接庫參數

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=data
DB_USERNAME=root
DB_PASSWORD=123456      

3、使用DB facade實作CURD

如果配置完資料庫資訊不生效,可以清理緩存重新開機服務

php artisan cache:clear
php artisan config:clear
php artisan serve      

CURD函數

static array select(string $query, array $bindings = [])
static bool insert(string $query, array $bindings = [])
static int update(string $query, array $bindings = [])
static int delete(string $query, array $bindings = [])      

完整示例

namespace App\Http\Controllers;


use Illuminate\Support\Facades\DB;


class StudentController extends Controller
{
    function list()
    {
        # 查詢
        $list = DB::select('select * from student');

        // return $list;    // json
        // var_dump($list); // Array
        dd($list);          // 便于檢視的Array

    }

    function insert()
    {
        // 插入
        $bool = DB::insert('insert into student(name, age) values(?, ?)',
            ['小白', 23]
        );

        var_dump($bool);
        // bool(true)
    }

    function update()
    {
        // 更新
        $num = DB::update('update student set name = ? where id = ? ',
            ['大白', 1]
        );

        var_dump($num);
        // int(1)
    }

    function delete()
    {
        // 删除
        $num = DB::delete('delete from student where id = ?',
            [2]
        );
        var_dump($num);
        // int(1)
    }

}
      

九、查詢構造器

Laravel查詢構造器query builder

使用PDO參數綁定,SQL注入保護

列印執行的SQL語句

# 安裝
$ composer require "eleven26/listen-sql:~1.0.4" --dev

# 修改 bootstrap/app.php
$app->register(Eleven26\ListenSql\ListenSqlServiceProvider::class);

# 啟動
$ php artisan listen-sql:start
      
控制台實時檢視 sql

1、新增資料

$data = [
    'name' => '小白',
    'age' => 23
];

// 1、插入
$bool = DB::table('student')->insert($data);
// insert into `student` (`name`, `age`) values ("小白", 23)

var_dump($bool);
// bool(true)

// 2、插入并擷取自增id
$id = DB::table('student')->insertGetId($data);
// insert into `student` (`name`, `age`) values ("小白", 23)

var_dump($id);
// int(2)


$list = [
    ['name' => '小白', 'age' => 23],
    ['name' => '大白', 'age' => 24],
];

// 3、插入多條資料
$bool = DB::table('student')->insert($list);
// insert into `student` (`age`, `name`) values (23, "小白"), (24, "大白")

var_dump($bool);
// bool(true)      

2、更新資料

// 1、更新, 注意要寫where條件
$num = DB::table('student')
    ->where('id', '=',1)
    ->update(['name' =>  '大黃']);
// update `student` set `name` = "大黃" where `id` = 1

var_dump($num);
// int(1)


// 2、自增,預設1
$num = DB::table('student')->increment('age');
// update `student` set `age` = `age` + 1

var_dump($num);
// int(8)


// 3、自減,預設1
$num = DB::table('student')->decrement('age');
// update `student` set `age` = `age` - 1

var_dump($num);
// int(8)


// 4、帶條件自增
$num = DB::table('student')
    ->where('id', 1)
    ->increment('age');
// update `student` set `age` = `age` + 1 where `id` = 1

var_dump($num);
// int(1)


// 5、自增額外修改其他字段
$num = DB::table('student')
    ->where('id', 1)
    ->increment('age', 1, ['name' => '大白']);
// update `student` set `age` = `age` + 1, `name` = "大白" where `id` = 1

var_dump($num);
// int(1)      

3、删除資料

// 1、删除資料
$num = DB::table('student')
    ->where('id', '=', 1)
    ->delete();
// delete from `student` where `id` = 1

var_dump($num);
// int(1)


// 2、清空資料, 危險 謹慎使用
$num = DB::table('student')->truncate();
// truncate `student`

var_dump($num);
// NULL
      

4、查詢資料

// 1、get擷取清單
$list = DB::table('student')->get();
// select * from `student`

// 2、first擷取一條資料
$data = DB::table('student')
    ->orderBy('age', 'desc')
    ->first();
// select * from `student` order by `age` desc limit 1

// 3、where條件
$data = DB::table('student')
    ->where('age', '>=', 24)
    ->get();
// select * from `student` where `age` >= 24

// 4、where多條件
$data = DB::table('student')
    ->whereRaw('id > ? and age > ?', [1, 23])
    ->get();
// select * from `student` where id > 1 and age > 23

// 5、傳回鍵值對,第二個字段是key,第一個字段是value
// 5.3版本棄用了lists,使用pluck
$data = DB::table('student')
    ->pluck('name', 'id');
// select `name`, `id` from `student`

// 6、select 指定字段
$data = DB::table('student')
    ->select('name', 'age')
    ->get();
// select `name`, `age` from `student`

// 7、chunk分段擷取,必須加order排序
DB::table('student')
    ->orderBy('id')
    ->chunk(2, function ($list) {
        echo $list;
    });
// select * from `student` order by `id` asc limit 2 offset 0
// select * from `student` order by `id` asc limit 2 offset 2
// ...
      

5、聚合函數

count 計數

max 最大值

min 最小值

avg 平均值

sum 求和

$count = DB::table('student')->count();
// select count(*) as aggregate from `student`

var_dump($count);
// int(3)

$count = DB::table('student')->min('age');
// select min(`age`) as aggregate from `student`      

十、Eloquent ORM

Active Record

每一張表都有一個與之對應的模型Model

1、模型建立及查詢資料

預設關聯模型名稱的複數表名

預設以id為主鍵

// 1、全部資料
Student::all();
// select * from `student`

// 2、根據主鍵id查找一條資料
Student::find(1);
// select * from `student` where `student`.`id` = 1 limit 1

// 3、根據主鍵id查找一條資料,如果沒有抛出異常
Student::findOrFail(11);
// select * from `student` where `student`.`id` = 1 limit 1

// 4、擷取清單
Student::get();
// select * from `student`

// 5、擷取一條資料
Student::where('id', '>', 1)
    ->orderbyDesc('age')
    ->first();
//  select * from `student` where `id` > 1 order by `age` desc limit 1

// 6、chunk分次擷取
Student::chunk(2, function ($data){
    var_dump($data);
});
// select * from `student` order by `student`.`id` asc limit 2 offset 0
// select * from `student` order by `student`.`id` asc limit 2 offset 2
// ...

// 7、聚合函數
Student::count();
// select count(*) as aggregate from `student`

Student::where('id', '>=', 1)
    ->max('age');
// select max(`age`) as aggregate from `student` where `id` >= 1
      

2、新增資料,自定義時間戳及批量指派

(1)通過模型新增,涉及到自定義時間戳

預設維護時間字段created_at, updated_at

[1]新增資料

# 取消自動維護時間字段,一般設定為true
public $timestamps = false;

# 自定義時間戳格式
public function getDateFormat(){
    return time();
}      

通過模型新增資料

$student = new Student();
$student->name = '小孫';
$student->age = 23;
$bool = $student->save();
// insert into `student` (`name`, `age`, `updated_at`, `created_at`) 
// values ("小孫", 23, "157459359, "1574593597")

      

[2]擷取資料

擷取資料的時候會自動格式化

$student = Student::find(5);
echo $student->created_at;
// 2019-11-24 10:11:23      
// 不自動格式化時間戳
protected function asDateTime($value)
{
    return $value;
}

// 自定義格式化
date('Y-m-d H:i:s', $student->created_at);
// 2019-11-24 10:11:23      

時區設定

方法一:修改php.ini配置檔案

// 檢視php.ini檔案路徑
phpinfo()

$ cp php.ini.default php.ini

[Date]
date.timezone = PRC
// 或者
// date.timezone = "Asia/Shanghai"
// PRC是指中華人民共和國 (People's Republic of China)      

方法二:臨時修改

// 檢視目前時區
date_default_timezone_get();

// 臨時設定時區
date_default_timezone_set('Asia/Shanghai');
      
PHP 的 date 日期時間函數庫簡介

如果不生效需要修改Laravel配置

config/app.php

// 'timezone' => 'UTC',
'timezone' => 'PRC',      

(2)使用模型create方法新增資料,涉及批量指派

// 指定允許批量指派的字段
protected $fillable = ['name', 'age'];

// 指定不允許批量指派的字段
protected $guarded = [];      
$data = [
    'name'=> '小紅',
    'age'=> 23
];

$student = Student::create($data);
// insert into `student` (`name`, `age`, `updated_at`, `created_at`) 
// values ("小紅", 23, "157459331, "1574593314")
      

查找或建立 firstOrCreate()

// 存在則擷取
$data = [
    'name'=> '小紅',
    'age'=> 23
];

$student = Student::firstOrCreate($data);
// select * from `student` where (`name` = "小紅" and `age` = 23) limit 1

// 不存在則建立
$data = [
    'name'=> '小紅',
    'age'=> 25
];

$student = Student::firstOrCreate($data);
// select * from `student` where (`name` = "小紅" and `age` = 25) limit 1
// insert into `student` (`name`, `age`, `updated_at`, `created_at`) 
// values ("小紅", 25, "157459366, "1574593662")
      

查找或建立執行個體,儲存需要調用save

firstOrNew()

3、修改資料

(1)模型更新

$student = Student::find(4);
// select * from `student` where `student`.`id` = 4 limit 1

$student->name = '大白';

$student->save();
// update `student` 
// set `name` = "大白", `student`.`updated_at` = 1574594275 
// where `id` = 4      

(2)批量更新

Student::where('id', 1)->update(['name' => '大白']);
// update `student` 
// set `name` = "大白", `student`.`updated_at` = 1574594465 
// where `id` = 1
      

4、删除資料

(1)模型删除

$student = Student::find(4);
//  select * from `student` where `student`.`id` = 4 limit 1

$bool = $student->delete();
// delete from `student` where `id` = 4
      

(2)主鍵删除

$num = Student::destroy(1);
// select * from `student` where `id` in (1)
// delete from `student` where `id` = 1

$num = Student::destroy(1, 2, 3);
// select * from `student` where `id` in (1, 2, 3)
// delete from `student` where `id` = 2
// delete from `student` where `id` = 3

$num = Student::destroy([1, 2, 3]);
// select * from `student` where `id` in (1, 2, 3)
// delete from `student` where `id` = 1
// delete from `student` where `id` = 2
// delete from `student` where `id` = 3      

(3)條件删除

$num = Student::where('id', '=', '1')->delete();
// delete from `student` where `id` = "1"      

十一、Blade模闆引擎

Blade模闆引擎可以使用PHP代碼

編譯完成後會被緩存

1、模闆繼承

resources/views/student/layout.blade.php

<h1>@yield('title', '标題')</h1>

<div>
    @section('main')
        主要内容
    @show
</div>
      

resources/views/student/index.blade.php

@extends('student/layout')

@section('title')
    重寫标題
@stop

@section('main')
    @parent
    重寫内容
@stop
      

Controller傳回模闆

namespace App\Http\Controllers;


class StudentController extends Controller
{
    function list()
    {
        $data = [
            'name' => 'Tom'
        ];
        return view('student/index', $data);
    }
}
      

編譯結果

<h1>重寫标題</h1>

<div>主要内容重寫内容</div>
      

2、基礎文法和include

// 1、模闆中輸出PHP變量
{{ $name }}

// 2、模闆中調用PHP代碼
{{ time() }}
{{ date('Y-m-d H:i:s', time()) }}
{{ in_array($name, $arr) ? 'true' : 'false' }}
{{ var_dump($arr) }}

{{ isset($name) ? $name : 'default' }}
{{ $name or 'default' }}

// 3、原樣輸出
@{{ @name }}

// 4、注釋
{{-- 這是模闆注釋,看不到 --}}
<!-- 這是html注釋,可以看到 -->

// 5、引入子視圖
@include('student.common', ['key' => 'value'])      

3、流程控制

// if控制
@if($name == 'Tom')
    Tom
@elseif($name == 'Jack')
    Jack
@else
    else
@endif

// unless === not if
@unless($name != 'Tom')
    Tom
@endunless

// for循環
@for ($i=0; $i < 10; $i++)
    {{$i}}
@endfor

@foreach($students as $student)
    {{$student->name}}
@endforeach

// forelse 數組為空給預設值
@forelse($students as $student)
    {{$student->name}}
@empty
    null
@endforelse      

4、模闆中的URL

url 路由名稱生成

action 控制器和方法名生成

route 别名生成

控制器設定

Route::get('student/list', ['as'=> 'list', 'uses'=> 'StudentController@list']);      

三種方式結果一樣

{{ url('student/list') }}
{{ action('StudentController@list') }}
{{ route('list') }}      

總結

安裝Laravel

核心目錄檔案

路由

MVC

資料庫操作3種

模闆引擎