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 !!} ,例如富文字格式。