PHP Laravel

江霽月吖發表於2020-12-09

laravel目錄結構

  1. app:laravel專案的核心程式碼
    1. app\Http\Controller.php: 定義控制器
  2. bootstrap:
    1. app.php:用於框架的啟動和自動載入配置
    2. cache: 處理快取
  3. config:配置檔案
  4. database: 資料庫
  5. public: 定義了專案的入口檔案:
    1. index.php,localhost:8000,就會訪問入口檔案,前端靜態資源
  6. resources: 本地化語言檔案
  7. routes:路由
  8. storage: 要與app資料夾產生聯絡
  9. tests:測試
  10. vendor:依賴

全域性配置阿里雲 Composer 全量映象

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

composer部署laravel專案

建立一個名為laravel的laravel專案
composer create-project laravel/laravel --prefer-dist ./

在專案根目錄用artisan生成控制器檔案

命令格式:
php artisan make:controller 控制器名(大駝峰)+Controller關鍵詞
例:
php artisan make:controller IndexController

路由

  1. 註冊路由:
    1. 常規用法:
      1. Route::請求方式(請求地址,function(){ return view(“頁面名字”); });
      2. 請求方式: get、post、put、delete、patch
      3. 前端頁面:
    2. 多匹配用法: 只能接收定義得請求方式
      1. Route::match([請求方式1,請求方式2…],請求地址,function(){});
    3. 全匹配用法: 所有請求方式都能接收
      1. Route::any(請求地址,function(){});
    4. 具體請求用法: 將請求傳送到某個控制器的某方法中
      1. Route::三種用法皆可(請求地址, 控制器名@方法名);
  2. 重定向路由: 將前端傳送的請求,傳送到另一個路由中
    1. Route::Redirect(前端請求地址, 另一個路由請求地址);
  3. 檢視路由: 跳轉頁面同時,給新頁面傳遞引數
    1. Route::view(請求地址, 跳轉頁面名字, [ “key” => “value”,… ]);
  4. 帶引數的路由:
    1. Route::請求方式(請求地址/{引數名1}/{引數名2},function(引數1,引數2){});

DB類

對資料庫中的某個表增加資料主要有兩個函式可以實現,分別是insert()和insertGetld()
insert()可以同時新增一條或多條,返回值是布林型別.
insertGetid(),只能新增一條資料,返回自增的id.
注意:DB:table(‘無字首的表名’)->insert();//連貫操作/鏈式操作

//新增方法
    public function add(){
        //定義關聯操作的表
        $db = DB::table('laravel');
        //插入資料
        $result = $db -> insert([
            [
                'name'=>'馬春梅',
                'age'=>'19',
                'email'=>'machunmei@qq.com'
            ],
            [
                'name'=>'馬夏梅',
                'age'=>'20',
                'email'=>'maxiamei@qq.com'
            ],
            [
                'name'=>'馬秋梅',
                'age'=>'21',
                'email'=>'maqiumei@qq.com'
            ],
            [
                'name'=>'馬冬梅',
                'age'=>'22',
                'email'=>'madongmei@qq.com'
            ],
        ]);
        dd($result);
    }


//insertGetid()方法如下:返回的是資料id
 $result = $db->insertGetId([
                    'name'=>'馬*梅',
                    'age'=>'33',
                    'email'=>'ma*mei@qq.com'
        ]);
        dd($result);

業務中一般採用偽刪除/邏輯刪除
資料刪除可以通過delete函式和truncate函式實現.
Delete    表示刪除記錄;
Truncate  表示清空整個資料表;
->delete();
案例:
//刪除id為1的記錄
$data = $db->where('id','=','1')->delete();
dd($data);//返回的是受影響的行數

資料修改可以使用update()、increment()和 decrement()函式來實現.
Update表示可以修改整個記錄中的全部欄位;
Increment和decrement表示修改數字欄位的數值(遞增或者遞減);

補充:
在laravel 中如果想友好輸出列印內容,可以使用dd方法語法:dd(列印內容);[dump+die]

案例:把id=1的名稱,改名為’張三丰’
->where()->update([])

where語法:
->where(欄位,運算子,)  //如果運算子為"=",則第二個引數可以不寫

public function update(){
    $db = DB::table('laravel');
    $result = $db -> where('id','=','1')->update([
        //需要修改欄位的鍵值對
        'name'=>'張三丰',
    ]);
    dd($result);//返回的是受影響的行數
}

DB::table('member')->increment('votes');    每次+1
DB::table('member')->increment('votes',5);  每次+5
DB::table('member')->decrement('votes');    每次-1
DB::table('member')->decrement('votes' 5):  每次-5

  1. 取出基本資料
//查詢所有資料,GET查詢的結果每一行的記錄是物件的形式,不是陣列
$data = $db->get();    //get:查詢所有資料,返回的是結果集
foreach ($data as $k => $v){
    echo "id是: {$v->id}名字是:{$v->name}郵箱是:{$v->email}年齡是:{$v->age}</br>";
}
案例二:
//查詢id>3
    $data = $db -> where('id','>','3')->get();
    dd($data);
//注意:where方法之後繼續呼叫where方法.
-> where() -> where() -> where()..   //這個語法是並且關係語法。
-> where() -> orWhere() -> orWhere()//這個語法是或者關係語法。
orWhere引數與where一樣
案例三:
//查詢id>2並且age<21
$data = $db->where('id','>','2')->Where('age','<','21')->get();
dd($data);
//查詢id>2或者age<20的
$data = $db->where('id','>','2')->orWhere('age','<','20')->get();
dd($data);
  1. 取出單行資料
->first()  //返回的是第一條記錄,返回值是一個物件
//返回第一條記錄
$data = $db->first();
dd($data);
  1. 獲取某個具體的值(一個欄位)
->value('欄位名')  
案例:
$data = $db -> where('id','=','3')->value('name');
dd($data);
  1. 獲取某些欄位資料(多個欄位)
->select('欄位名1','欄位名2'.....)
->select('欄位名1 as 別名','欄位名2 as 別名'.....)
//返回某些欄位資料
$data = $db ->select('name','email')->get();
dd($data);
  1. 排序操作
desc //降序
asc  //升序
->orderBy('欄位名','排序方式')
案例:
//排序:降序
$data = $db ->orderBy('id','desc')->get();
dd($data);
  1. 分頁操作
->limit()->offset()
limit   //表示限制輸出的條數
offset  //從什麼地方開始
案例:
//限制輸出分頁查詢從第0條開始數3條資料
$data = $db->limit(3)->offset(0)->get();
dd($data);

view

檢視檔案目錄

resources\views
檢視也可以分目錄管理的

檢視命名與渲染

  1. 檔名習慣小寫(建議小寫)
  2. 檔名的字尾是.blade.php(因為laravel裡面有一套模板引擎就是使用blade,可以直接使用標籤語法{{$title}},也可以使用原生的php語法顯示資料)
  3. 需要注意的是也可以使用.php結尾,但是這樣的話就不能使用laravel提供的標籤{{$title}}語法顯示資料,只能使用原生語法<?php echo $title; ?>顯示資料
    兩個檢視檔案同時存在,則.blade.php字尾的優先顯示。
展示檢視的方法:
return view('檢視檔案的名稱');
檢視可以進行分目錄管理的,例如需要展示home/test3檢視,則可以寫成:
return view('home/test3')
當然也支援點寫法:
return view('home.test3')

變數分配與展示

語法:
view(模板檔名稱,陣列)   //陣列就是需要分配的變數集合,陣列是一個鍵值陣列,其鍵與變數名一致
view(模板檔名稱->with(陣列)
view(模板檔名稱)->with(名稱,)->with(名稱,)
使用view()方式渲染一個檢視後,在.blade.php_的檢視檔案中,模板中輸出變數使用"{{$變數名}}"(變數名就是分配過來陣列的鍵)

compact函式使用(傳參)

compact是php中內建的函式與laravel框架無關.
作用:用於打包陣列.

語法:
compact('變數名1','變數名2'....)
案例:
$date = date('Y-m-d H:i:s',time());
$day = '二';
return view('home/home',compact('date','day'));

模板中直接使用函式

在laravel中.檢視呼叫函式其語法基本與js、php的語法一致,只不過要求左右包含大括號:
語法:{{函式名(引數1,引數2)}}
說明:函式名可以是php內建的.也可以是laravel框架中定義的


案例:在資料庫中一般儲存時間都是以時間戳去儲存的,但是在頁面上展示的時候不適合使用時間戳了.需要在展示的時候再對其進行格式化處理,如需要在檢視中進行對其格式化則怎麼寫?
TestController.php(控制器):
public function home(){
    $date = date('Y-m-d H:i:s',time());
    $day = '二';
    //傳遞時間戳
    //一年後的時間戳
    $time = strtotime('+1 year');//一個月  +1 month,week
    return view('home/home',compact('date','day','time'));
}


view檢視檔案中呼叫函式:
一年之後的時間是:{{date('Y-m-d H:i:s',$time)}}

迴圈與分支語法標籤

  1. 在檢視裡遍歷資料
在laravel中模版中迴圈輸出資料,則需要遵循語法:
@foreach($variable as $key => $value)
    //迴圈體
@endforeach
在此過程中需要注意的就是get查詢到的結果集中每一條記錄其實都是一個物件,因此在迴圈具體欄位的時候需要注意使用物件呼叫屬性的方式才可以獲取其資料。
案例:
<table border="1">
    <tr>
        <td>id</td>
        <td>姓名</td>
        <td>年齡</td>
        <td>email</td>
    </tr>
    @foreach($data as $key => $value)
        <tr>
            <td>{{$value->id}}</td>
            <td>{{$value->name}}</td>
            <td>{{$value->age}}</td>
            <td>{{$value->email}}</td>
        </tr>
    @endforeach
</table>
  1. 在檢視裡執行if判斷
語法:
@if(條件表示式1)
執行的語句1
@elseif()
執行的語句2
....
@else
預設的執行語句
@endif

模板繼承/包含

繼承不僅僅在php類中存在,在檢視中同樣存在.一般是用於做有公共部分的頁面.

語法:@yield('名字')   在父級頁面中的佔位


演示:

檔名:base.blade.php
<h1>我是頭部</h1>
<!--  可變區域  -->
@yield('mainbody')
<!--  可變區域  -->
<h1>我是尾部</h1>


繼承語法:
子模版中按以下語法書寫:
@extends('需要繼承的模版檔名')  //其名稱是完整路徑
通過section標籤繫結區塊/部件到父級頁面,區塊名稱就是父級頁面yield標籤的引數名.
@section('區塊名稱')
程式碼
@endsction



演示:

檔名:test.blade.php
@extends('base') //如果是分目錄管理請補全路徑
<!--  指定yield標籤的名字,繫結區塊  ->
@section('mainboddy')
<div>
此行位置: display1函式執行結束:理論上區域性變數$name應該已經被釋放
$closure();//當前區域性變數$name在$closure = display1();這一行display1函式執行結束後並沒有被釋放,從而在外部呼叫(也就是此行)內部匿名函式的時候可以被使用
</div>
@endsction

<!--  檔案的包含  -->
@include('home.test4')

外部靜態檔案引入方式

在寫頁面肯定會引入相關的外部檔案(js、css、image),則會涉及到路徑的問題.以下面的這個app.css為例,看如何去引入該css檔案:

以前的(首選):
<link rel="stylesheet" type="text/css" href="/css/app.css">
在laravel中:
Asset方法中的引數可以是多級目錄也可以是單級目錄。
<link rel="stylesheet" type="text/css" href="{{asset('css')}}/app.css">

Laravel-CSRF

案例:通過案例實現csrf的機制驗證
1. 建立兩個路由,一個用於展示表單(get),另外處理請求(post)
檔名:web.php(路由檔案)
//CSRF驗證
Route::get('home/test6','App\Http\Controllers\TestController@test6');
Route::post('home/test7','App\Http\Controllers\TestController@test7');

檔名:TestController.php
//展示基礎的表單
public function test6(){
    return view('home/test6');
}
//處理請求
public function test7(){
    return '處理成功';
}

檔名:test6.blade.php
<form action="{{route('test7')}}" method="post">
姓名:<input type="text" name="name" value="" placeholder="請輸入姓名"/>
{{csrf_field()}}
<input type="submit" value="提交"/>
</form>:
<form action="{{route('test7')}}" method="post">
姓名:<input type="text" name="name" value="" placeholder="請輸入姓名"/>
<input type="hidden" name="_token" value="{{csrf_token()}}"/>
<input type="submit" value="提交"/>
</form>

兩者的區別:

  1. csrf_token只是輸出token的值
  2. csrf_field輸出了一個整個的input隱藏域
    在後期使用的時候怎麼選擇:大部分情況下可以自己根據情況選擇.但是有一個情況下開發者是沒有選擇許可權的,必須需要使用csrf_token的,這個情況就是使用非同步提交表單的方式.
  3. @csrf()是{{csrf_field()}}的簡寫

從CSRF驗證中排除例外路由

並不是所有請求都需要避免CSRF攻擊,比如去第三方API獲取資料的請求.
可以通過在VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中介軟體中將要排除的請求URL新增到$except屬性陣列中.

相關文章