1. 程式人生 > >Laravel5.7學習筆記

Laravel5.7學習筆記

【安裝Laravel】

Composer安裝:

composer create-project --prefer-dist laravel/laravel

目錄結構:

網站根目錄指向了/public,訪問報錯:

原因是並沒有vendor這個資料夾,看了這篇部落格https://blog.csdn.net/leedaning/article/details/46343685

在根目錄執行 composer update,下載了一大堆東西

完事訪問一片空白,錯誤500......然後各種百度,各種設定目錄許可權:

chmod -R 777 storage/
chmod -R 777 bootstrap/cache/
chmod -R 777 vendor/

還是不行,最後查看了/storage/logs下面的日誌,有報錯:

少了這麼一個key,再次百度,我的做法是:把根目錄.env.example這個隱藏檔案重新命名為.env

然後根目錄執行 php artisan key:generate

(參考部落格:https://blog.csdn.net/qq_39479575/article/details/78495703

終於打開了這個頁面,真不容易,明天我得吃個雞腿慶祝一下......

使用 php artisan --version 命令檢視安裝的Laravel版本,是最新的5.7版本 :

【一些配置】 

Laravel 所有的配置檔案都放在根目錄 /config 下面:

修改app.php,開啟debug:

設定時區為Asia/Shanghai:

控制器目錄:

檢視層目錄:

【初識路由】

與thinkphp相比,Laravel不能通過 /模組名/控制器名/操作名 直接訪問web介面

每一個web介面都必須在 /routes/web.php 中定義一條路由規則:

預設路由配置的意思是:訪問根目錄(網站首頁),渲染檢視層的"歡迎"頁面:

Route::get('/', function () {
    return view('welcome');
});

在控制器目錄新建了一個IndexController.php:

<?php

namespace App\Http\Controllers;

class IndexController extends Controller
{
    public function index(){
    	return '這是首頁';
    } 
}

修改首頁路由:

Route::get('/', '[email protected]');

再次訪問首頁:

專案通常會區分前後臺,在tp中可以通過劃分模組來實現,Laravel中同樣可以用這個原理

在控制器目錄下新建了兩個資料夾:Index、Admin,分別作為前、後臺控制器模組:

以後臺Admin為例,在下面新建兩個控制器Index和User

手動建立太low了,Laravel使用命令列建立控制器、Model,名稱空間都自動幫你寫好......

php artisan make:controller Admin/IndexController

IndexController.php:

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class IndexController extends Controller
{
    public function index(){
    	return '後臺首頁';
    } 
}

UserController.php:

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    public function userlist(){
    	return '後臺使用者列表頁';
    } 

    public function useradd(){
    	return '後臺使用者新增';
    } 
}

在設定路由的時候,可以通過設定路由組group,共享路由屬性。如:名稱空間namespace、路由字首prefix、中介軟體middleware等。

路由組規則設定如下:

//在App\Http\Controllers\Admin名稱空間下的控制器
Route::namespace('Admin')->group(function () {
    //後臺首頁
    Route::group(['prefix' => 'admin/index'], function () {
        // 首頁顯示
        Route::get('index', '[email protected]');
    });

    //後臺使用者
    Route::group(['prefix' => 'admin/user'], function () {
        //使用者列表
        Route::get('userlist', '[email protected]');

        //使用者新增
        Route::get('useradd', '[email protected]');
    });
});

這樣就可以實現類似tp那樣的 /模組名/控制器名/操作名 的訪問方式:

(當然路由字首prefix和路由名稱可以隨意定義,不一定要遵循tp的寫法,這裡只是為了清晰明瞭) 


【中介軟體】

Laravel的中介軟體在 /app/Http/Middleware 目錄下,用於過濾HTTP請求,可以做一些欄位驗證、身份驗證、CSRF 防護等等......

Laravel自帶了一些中介軟體:

 例:設定一個CheckLog中介軟體,判斷使用者是否登入,如果登入了可以看使用者列表頁,否則跳轉到首頁

執行生成中介軟體命令:(這裡和控制器一樣採用前後臺目錄分開放的方式)

php artisan make:middleware Admin/CheckLog

 

CheckLog.php中介軟體內容:

<?php

namespace App\Http\Middleware\Admin;
use Illuminate\Http\Request;
use Closure;

class CheckLog
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $mid = $request->cookie('mid');
        if(empty($mid)){
            return redirect('admin/index/index');
        }
        //處理請求之前執行動作
        return $next($request);
    }
}

 寫好中介軟體之後需要註冊中介軟體,在 /app/Http/Kernel.php 裡面註冊

目的是給路由分配中介軟體,在 routeMiddleware 屬性裡新增:

'admin.checklog' => \App\Http\Middleware\Admin\CheckLog::class,

修改/routes/web.php路由配置,給後臺使用者路由組新增中介軟體屬性:

//後臺使用者
Route::group(['prefix' => 'admin/user' , 'middleware' => 'admin.checklog'], function () {
    //使用者列表
    Route::get('userlist', '[email protected]');

    //使用者新增
    Route::get('useradd', '[email protected]');
});

此時訪問使用者列表頁,會先走中介軟體判斷登入狀態,沒登入跳轉到首頁:

(Kernel.php中其他中介軟體屬性:全域性中介軟體$middleware、中介軟體組$middlewareGroups、中介軟體執行順序$middlewarePriority) 

如果不給路由設定中介軟體屬性,也可以在控制器的構造方法裡設定中介軟體,可以指定或排除具體某一個操作,示例如下:

<?php

namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
    public function __construct(){
        //全部操作生效
        $this->middleware('admin.checklog');

        //僅xxx操作生效
        // $this->middleware('admin.checklog')->only('userlist');

        //除xxx操作生效
        // $this->middleware('admin.checklog')->except('useradd');
    }

    public function userlist(){
    	return '後臺使用者列表頁';
    } 

    public function useradd(){
    	return '後臺使用者新增';
    } 
}

【請求 request】

獲得請求,首先需要引入 Illuminate\Http\Request 

基本使用:

<?php

namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class IndexController extends Controller
{
    public function index(Request $request){
    	$uri = '請求路徑:'.$request->path();
    	$url = '請求URL:'.$request->url();
    	$method = '請求方法:'.$request->method();
    	$name = '獲取請求引數:'.$request->input('name');
    	$mid = '獲取cookie:'.$request->cookie('mid');
        $key = '獲取session:'.$request->session()->get('key');
    	$file = '獲取上傳檔案:'.$request->file('photo');
    	dump($uri);
    	dump($url);
    	dump($method);
    	dump($name);
    	dump($mid);
    	dump($file);

    	//驗證請求路徑
    	//if ($request->is('admin/*')) {
        //}

        //驗證請求方法
        //if ($request->isMethod('post')) {
        //}
    } 
}

【分配資料 渲染檢視】

以後臺首頁檢視 /admin/index/index 為例:

控制器使用 view() 函式渲染檢視,同時分配資料:

<?php

namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
class IndexController extends Controller
{
    public function index(){
    	//分配一個欄位
    	// $name = 'lws';
        // return view('admin.index.index')->with('name',$name);

        //分配陣列
    	$data = ['name' => 'lws','sex' => 'nan'];
        return view('admin.index.index', $data);

        //也可以使用php的compact函式傳值
        //$name = 'lws';
        //$sex = 'nan';
        //return view('admin.index.index',compact('name','sex'));
    } 
}

檢視層使用雙大括號 {{ }} 獲得資料:

姓名:{{$name}}<br/>
性別:{{$sex}}

 
{{ $test }} 會自動呼叫 PHP 的 htmlspecialchars()函式防止 XSS 攻擊,如果不需要轉義可使用 {!! $test !!} ,例如富文字格式。