一、laravel簡介
laravel是一套優雅簡介的PHP開發框架,受歡迎程度非常之高,功能強大,工具齊全;今天我們一起來看看框架的基礎知識
二、版本選擇本篇學習筆記以laravel5.2.15版本為框架的版本基礎;更多版本請移步https://www.golaravel.com/
三、laravel下載安裝以及開發環境搭建(一):環境搭建由於laravel使用較多的php新特性,所以新版本的laravel對PHP的版本要求比較高,這裡選擇的laravel5.2.15要求 PHP>5.5.9+ 。Win系統下推薦使用整合的開發環境比如wamp、phpStudy、Xampp都可以,下載安裝的時候需要注意PHP版本,Linux系統下需要編譯安裝。
(二):下載、安裝及大致介紹1、安裝包下載安裝原本laravel中文網是可以下載一鍵安裝包的,但是等我去下載的時候發現沒地方可以下載,也只能通過度娘找其它下載資源下載安裝包然後安裝;我的資源:https://github.com/yuwenbo5/laravel5.2.15.git;下載安裝包後解壓更改名稱(laravel),直接拷貝到環境根目錄www(win下wamp環境)或者 /var/www/html(linux下lamp環境)中;開啟瀏覽器輸入url:localhost/laravel/public 然後回車,出現如下畫面表示安裝成功:
2、composer安裝cd到環境根目錄,使用命令:composer create-project --prefer-dist laravel/laravel=5.2.15 laravel(專案名稱,可修改)
3、簡單介紹laravel是基於mvc模式的php框架,m——模型層,v——檢視層,c——控制器層;以下為laravel框架的目錄檔案,框出來的檔案目錄將在後續中用到:
app是應用的核心程式碼檔案目錄,以後的程式碼基本都在這裡完成;app/Http/Controller目錄是應用的控制器檔案;routes.php是框架的路由檔案,負責路由分配和對映;Http下的類檔案,比如上面目錄中的User.php、Menu.php檔案是應用的模型檔案;config目錄是所有應用的配置檔案目錄;public是框架的入口檔案及靜態資原始檔目錄;resources/views則是應用的檢視檔案目錄。
四、laravel路由(一):簡介用過thinkPHP的開發者都知道,傳統的MVC的url都是對應應用的控制器及控制器中的方法,laravel中的MVC則是通過路由功能對映到對應的程式(控制器方法),通過路由將使用者的請求傳送到對應的程式進行處理,其作用就是建立url和處理程式之間的對映關係,這樣做有一個好處,對url進行美化只需要修改路由而無需對程式本身進行修改。
laravel中請求型別包括:get、post、put、patch、delete。
前面說了route.php是laravel的路由檔案,所有的路由對映都要通過編輯route.php檔案進行程式碼書寫。
(二):路由學習1、基本路由get請求:
1 <?php 2 3 //基本路由的get請求 4 5 Route::get('get_base', function(){ 6 return 'get request base'; 7 }); 8 9 10 瀏覽器輸入:http://127.0.0.1/laravel/public/get_base11 頁面輸出:get request base
post請求:
1 <?php 2 3 //基本路由的post請求 4 5 Route::post('post_base', function(){ 6 return 'post request base'; 7 }); 8 9 10 以上路由需要通過post方式請求,這裡不做演示11 請求後頁面輸出:post request base
2、多請求路由
顧名思義,多請求路由則是可以通過多種請求方式進行請求,多請求路由主要有兩種方式,match和any
(1)、match接收請求型別的陣列從而限定請求的型別:
1 <php 2 3 //多請求路由match 4 5 Route::match(['get','post'], 'multi', function(){ 6 return 'multi post or get'; 7 }); 8 9 url:http://127.0.0.1/laravel/public/multi10 此路由可通過get、post請求11 請求後返回字串:multi post or get
(2)、any方式
1 <?php 2 3 //any方式 4 5 Route::any('multi', function(){ 6 return 'multi get or post'; 7 }); 8 9 10 url:http://127.0.0.1/laravel/public/multi11 請求返回字串:multi get or post
3、路由引數
給路由繫結引數,接收引數進行處理
(1)、必選引數
1 <?php 2 3 //帶引數的路由 4 5 Route::get('myname/{name}', function($name){ 6 return 'my name is '.$name; 7 }); 8 9 10 url:http://127.0.0.1/laravel/public/myname/yuwenbo11 get訪問後頁面輸出:my name is yuwenbo
(2)、可選引數($userid=null表示預設值,可設定沒有引數時的預設值)
1 <?php 2 3 //可選引數繫結 4 5 Route::get('user/{userid?}', function($userid=null){ 6 return 'userid is '.$userid; 7 }); 8 9 訪問url:http://127.0.0.1/laravel/public/user/username10 輸出:userid is username11 12 訪問url:http://127.0.0.1/laravel/public/user13 輸出:userid is14 15 可選引數繫結使得路由很靈活
(3)、路由引數過濾(用正則表示式對傳入的引數進行過濾)
1 <?php 2 3 /* 4 引數過濾 5 */ 6 7 //單個引數過濾 8 Route::get('num/{num?}', function($num=15){ 9 return 'this num is '.$num;10 })->where('num','[0-9]+');11 12 訪問url:http://127.0.0.1/laravel/public/num/513 返回輸出:this num is 514 15 訪問url:http://127.0.0.1/laravel/public/num16 返回輸出:this num is 1517 18 訪問url:http://127.0.0.1/laravel/public/num/fhdja19 頁面報錯20 21 //多個引數過濾22 Route::get('info/{name}/{age?}', function($name,$age=null){23 return 'name is '.$name.', age is '.$age;24 })->where(['name' => '[a-zA-Z]+', 'age' => '[1-9]+']);25 26 可使用陣列形式過濾多個引數
4、路由別名給路由通過['as' => 'alias']陣列使用別名後,可通過route('別名')生成url,請看程式碼理解:
1 <?php 2 3 //路由別名 4 5 Route::get('student/info',['as' => 'studentInfo' ,function(){ 6 7 //通過route('studentInfo')生成完成url後返回 8 return route('studentInfo'); 9 10 }]);11 12 13 訪問url:http://127.0.0.1/laravel/public/student/info14 頁面返回:http://127.0.0.1/laravel/public/student/info15 16 注:別名的好處在於,以後在控制器中使用route('別名')的方式生成url後,即便修改了路由的名字,也不用再修改控制器程式,因為通過別名程式能自動生成修改後的url
5、路由群組
通過關鍵字group建立路由群組
1 <?php 2 3 /* 4 *路由群組 5 */ 6 7 Route::group(['prefix' => 'admin'], function(){ 8 9 //此時的訪問地址:http://127.0.0.1/laravel/public/admin/student/info10 Route::get('student/info',['as' => 'studentInfo' ,function(){11 return route('studentInfo');12 }]);13 14 //此時的訪問地址:http://127.0.0.1/laravel/public/admin/info/yuwenbo/2015 Route::get('info/{name}/{age?}', function($name,$age=null){16 return 'name is '.$name.', age is '.$age;17 })->where(['name' => '[a-zA-Z]+', 'age' => '[1-9]+']);18 19 });20 21 此時的訪問地址url必須要加上群組字首,否則將不能訪問
6、路由中輸出檢視通過view()函式輸入檢視
1 <?php 2 3 /** 4 * 路由中輸出檢視 5 */ 6 7 //框架的歡迎介面路由 8 9 Route::get('/',function(){10 return view('welcome');11 });12 13 訪問url:http://127.0.0.1/laravel/public14 瀏覽器顯示laravel的歡迎介面15 16 17 //做如下修改18 Route::get('welcome',function(){19 return view('welcome');20 });21 22 修改後訪問url:http://127.0.0.1/laravel/public/welcome23 瀏覽器同樣顯示laravel的歡迎介面
一般情況是不會在路由中輸出檢視的。
五、控制器控制器目錄app/Http/Controller,此目錄下有一個基本的控制器Controller,新增的控制器統一繼承此Controller;
名稱空間:namespce App\\Http\\Controller;
命名規則:控制器檔名跟類名統一首字母大寫,以 控制器名+Controller 為命名規則,比如新建一個控制器 :AdminController.php
1 <?php 2 /** 3 * Created by PhpStorm. 4 * User: Administrator 5 * Date: 2018/8/25/025 6 * Time: 0:51 7 */ 8 9 namespace App\\Http\\Controllers;10 11 class AdminController extends Controller12 {13 public function index()14 {15 return view('admin/index');16 }17 }18 19 20 新建控制器AdminController繼承於基類Controller
1、路由關聯控制器,通過路由訪問控制器程式:
1 <?php 2 3 //路由關聯對映控制器方法一: 4 5 Route::get('admin/index', 'AdminController@index'); 6 7 8 //路由關聯控制器方法二: 9 10 Route::get('admin/index', ['uses' => 'AdminController@index']);11 12 13 //路由別名關聯控制器:14 15 Route::get('admin/index', [16 'uses' => 'AdminController@index',17 'as' => 'adminindex'18 ]);
2、路由關聯控制器進行引數繫結:
1 //路由書寫 route.php 2 <?php 3 //結合之前學習的引數過濾 4 Route::get('admin/index/{num}', [ 5 'uses' => 'AdminController@index', 6 'as' => 'adminindex' 7 ])->where('num', '[0-9]+'); 8 9 ?>10 11 12 13 //控制器程式碼 AdminController.php14 <?php15 /**16 * Created by PhpStorm.17 * User: Administrator18 * Date: 2018/8/25/02519 * Time: 0:5120 */21 namespace App\\Http\\Controllers;22 23 class AdminController extends Controller24 {25 public function index($num)26 {27 return 'num is '.$num;28 }29 }30 31 ?>32 33 訪問url:127.0.0.1/laravel/public/admin/index/534 頁面輸出:num is 5
六、模型laravel框架的模型檔案在app目錄下,統一首字母大寫,檔名與類名一致,統一繼承於 Illuminate\\Database\\Eloquent\\Model 基類;
(一)、新建模型及使用 1 //模型檔案 Admin.php 2 <?php 3 /** 4 * Created by PhpStorm. 5 * User: Administrator 6 * Date: 2018/8/25/025 7 * Time: 13:35 8 */ 9 namespace App;10 use Illuminate\\Database\\Eloquent\\Model;11 12 class Admin extends Model13 {14 public static function getAdmin()15 {16 return 'this is admin model static getAdmin action';17 }18 19 }20 21 ?>22 23 24 //控制器檔案 AdminController.php25 <?php26 /**27 * Created by PhpStorm.28 * User: Administrator29 * Date: 2018/8/25/02530 * Time: 0:5131 */32 namespace App\\Http\\Controllers;33 34 class AdminController extends Controller35 {36 public function index()37 {38 return Admin::getAdmin();39 }40 }
(二)、資料庫操作連線資料庫mysql,laravel的資料庫連線只需要配置好資料庫的配置檔案即可,也就是config目錄下的database.php
1 //database.php檔案 2 3 4 'mysql' => [ 5 'driver' => 'mysql', 6 'host' => env('DB_HOST', 'localhost'), 7 'port' => env('DB_PORT', '3306'), 8 'database' => env('DB_DATABASE', 'forge'), 9 'username' => env('DB_USERNAME', 'forge'),10 'password' => env('DB_PASSWORD', ''),11 'charset' => 'utf8',12 'collation' => 'utf8_unicode_ci',13 'prefix' => 'shop_',14 'strict' => false,15 'engine' => null,16 ]17 18 //配置檔案讀取的是.env檔案的內容
開啟.env檔案,做如下配置修改即可連線到mysql資料庫
1 APP_ENV=local 2 APP_DEBUG=true 3 APP_KEY=base64:IxkVvrRLqdJeU9h8vGu1W58OG3NVuDtkMWyC6nIT4qs= 4 APP_URL=/file/2019/12/20/20191220062452_3803.jpg 5 6 //mysql連線配置 7 DB_CONNECTION=mysql 8 DB_HOST=localhost 9 DB_PORT=330810 DB_DATABASE=shop11 DB_USERNAME=root12 DB_PASSWORD=root13 14 CACHE_DRIVER=file15 SESSION_DRIVER=file16 QUEUE_DRIVER=sync17 18 REDIS_HOST=127.0.0.119 REDIS_PASSWORD=null20 REDIS_PORT=637921 22 MAIL_DRIVER=smtp23 MAIL_HOST=mailtrap.io24 MAIL_PORT=252525 MAIL_USERNAME=null26 MAIL_PASSWORD=null27 MAIL_ENCRYPTION=null
1、使用DB facade操作資料庫
類似原生的sql語句進行curd操作,例如:新建一個表user包含id、username、passwrod、email、sex、create_time、update_time欄位
1 <?php 2 /** 3 * 使用DB facade進行CURD操作 4 * Created by PhpStorm. 5 * User: Administrator 6 * Date: 2018/8/25/025 7 * Time: 0:51 8 */ 9 namespace App\\Http\\Controllers;10 use App\\Http\\Controllers\\Controller;11 use Illuminate\\Http\\Request;12 use Illuminate\\Support\\Facades\\DB;13 14 class AdminController extends Controller15 {16 17 public function query()18 {19 //查詢20 $user_list = DB::select('select * from user');//返回陣列21 22 23 //新增24 $bool = DB::insert('insert into user(username,email,sex) values(?, ? ,?)',25 ['admin', '[email protected]', '1']);//返回布林值26 27 //修改28 $rows = DB::update('update user set password=? where username=?',['123456', 'admin']);//返回影響的行數29 30 //刪除31 $rows = DB::delete('delete from user where username=?', ['admin']);//返回刪除的行數32 33 }34 }
使用DB facade操作資料庫,初學還是很簡單的,因為原生的sql還是比較熟的。
2、使用查詢構造器操作資料庫使用查詢構造器進行資料庫操作使得操作簡介、方便,示例使用上面的user表進行演示
查詢構造器----新增資料 1 <?php 2 /** 3 * 查詢構造器之新增資料 4 * Created by PhpStorm. 5 * User: Administrator 6 * Date: 2018/8/25/025 7 * Time: 0:51 8 */ 9 namespace App\\Http\\Controllers;10 use App\\Http\\Controllers\\Controller;11 use Illuminate\\Http\\Request;12 use Illuminate\\Support\\Facades\\DB;13 14 class AdminController extends Controller15 {16 17 public function query()18 {19 //插入一條資料20 $bool = DB::table('user')->insert(21 ['username' => 'yuwenbo', 'email' => '[email protected]', 'sex' => 1]22 );//返回布林值23 24 //插入一條資料返回插入的id25 $insert_id = DB::table('user')->insertGetId(26 ['username' => 'yuwenbo', 'email' => '[email protected]', 'sex' => 1]27 );28 29 30 //插入多條資料31 $bool = DB::table('user')->insert([32 ['username' => 'yuwenbo', 'email' => '[email protected]', 'sex' => 1],33 ['username' => 'tom', 'email' => '[email protected]', 'sex' => 0]34 ]);35 36 }37 38 }
查詢構造器-----更新資料:更新指定內容和自增自減兩種方式 1 <?php 2 /** 3 * 查詢構造器之更新資料 4 * Created by PhpStorm. 5 * User: Administrator 6 * Date: 2018/8/25/025 7 * Time: 0:51 8 */ 9 namespace App\\Http\\Controllers;11 use App\\Http\\Controllers\\Controller;12 use Illuminate\\Http\\Request;13 use Illuminate\\Support\\Facades\\DB;14 15 class AdminController extends Controller16 {17 18 public function query()19 {20 //更新指定內容21 $rows = DB::table('user')->where('username','admin')->update(['password' => '123456']);//返回影響的行數22 23 //更新自增自減24 $rows = DB::table('user')->where('username','admin')->increment('sex');//自增125 $rows = DB::table('user')->where('username','admin')->increment('sex',$n);//自增n26 27 $rows = DB::table('user')->where('username','admin')->decrement('sex');//自減128 $rows = DB::table('user')->where('username','admin')->decrement('sex',$n);//自減n29 30 //自增同時修改其它內容31 $rows = DB::table('user')->where('username','admin')->increment('sex', 3, ['email' => '[email protected]']);//自增同時修改內容32 33 }34 35 }
查詢構造器----刪除資料 1 <?php 2 /** 3 * 查詢構造器之刪除資料 4 * Created by PhpStorm. 5 * User: Administrator 6 * Date: 2018/8/25/025 7 * Time: 0:51 8 */ 9 namespace App\\Http\\Controllers;10 use App\\Http\\Controllers\\Controller;11 use Illuminate\\Http\\Request;12 use Illuminate\\Support\\Facades\\DB;13 14 class AdminController extends Controller15 {16 17 public function query()18 {19 //刪除資料20 $rows = DB::table('user')->where('username','admin')->delete();21 22 //清空資料(危險,謹慎使用)23 DB::table('user')->truncate();24 25 }26 27 }
查詢構造器-----查詢資料
1 <?php 2 /** 3 * 查詢構造器之查詢資料 4 * Created by PhpStorm. 5 * User: Administrator 6 * Date: 2018/8/25/025 7 * Time: 0:51 8 */ 9 namespace App\\Http\\Controllers;10 use App\\Http\\Controllers\\Controller;11 use Illuminate\\Http\\Request;12 use Illuminate\\Support\\Facades\\DB;13 14 class AdminController extends Controller15 {16 17 public function query()18 {19 //返回所有的資料get()20 $user_list = DB::table('user')->get();21 $user_list = DB::table('user')->where('id','>=',2)->get();22 23 //多條件查詢24 $user_list = DB::table('user')->whereRaw('id >= ? and sex = ?', ['5' ,'1'])->get();25 26 //按照預設排序返回第一條資料first()27 $user = DB::table('user')->first();28 $user = DB::table('user')->orderBy('id','desc')->first();29 $user = DB::table('user')->where('id', 2)->first();30 31 //返回結果集中指定的欄位pluck32 $usernames = DB::table('user')->whereRaw('id >= ? and sex = ?', ['5' ,'1'])->pluck('username');33 34 //返回指定欄位的下標lists35 $usernames = DB::table('user')->whereRaw('id >= ? and sex = ?', ['5' ,'1'])->lists('username', 'id');//以id作為下標36 37 //返回指定的多個欄位select()38 $user_list = DB::table('user')->where('id', '>=', '1')->select('username','email','sex')->get();39 40 //每次查指定的條數chunk41 DB::table('user')->chunk(2, function($user_list){42 dd($user_list);43 });44 45 }46 47 }
mysql中的聚合函式對應的構造器方法count()、max()、min()、avg()、sum(),使用都比較簡單也很好理解,這裡不再贅述
七、檢視laravel框架的檢視支援原生的php檔案,檢視的目錄 resources/views;
命名:統一以.php為字尾的PHP檔案,規則:檢視名+.+blade,例如新建一個檢視檔案:index.blade.php
一般情況下一個控制器會建一個檢視目錄,例如AdminController控制器,我們將在views下新建一個admin目錄
(一)、新建檢視1 //模板檔案 views/admin/index.blade.php2 3 this is views/admin/index.blade
(二)、輸出檢視
1 //路由檔案 2 <?php 3 //繫結控制器方法 4 Route::get('admin/index', 'AdminController@index'); 5 6 ?> 7 8 9 //控制器檔案 AdminController.php10 <?php11 /**12 * Created by PhpStorm.13 * User: Administrator14 * Date: 2018/8/25/02515 * Time: 0:5116 */17 namespace App\\Http\\Controllers;18 19 class AdminController extends Controller20 {21 public function index()22 {23 return view('adminindex');//傳入要輸出的模板名即可24 }25 }26 27 訪問url:http://127.0.0.1/laravel/public/admin/index28 頁面顯示:this is views/admin/index.blade
輸出檢視時可以攜帶變數然後在模板中輸出出來,這點將在後面的模板的詳細使用中用到;
(三)、模板詳解1、模板繼承由於多數頁面有相同部分,所以使用模板繼承簡化模板使用;以下首先在views/common下新建一個基本的公共模板檔案base.blade.php,公共的模板檔案放在views/common資料夾下
base.blade.php
index.blade.php
使用@section重寫子模板,使用@yield展示某個指定的section的內容;
@yield不能被子模板擴充套件,@section可以被子模板擴充套件
如果需要展示父模板內容,可使用@parent;例如:
1 @extends('common.base')2 3 @section('header')4 @parent5 header6 @stop
2、基礎語法及使用
輸出變數,使用{{ $變數名 }},如下所示:
1 //例如控制器中 2 3 public function index(){ 4 5 return view('index',['name' => 'yuwenbo']); 6 7 } 8 9 11 12 //模板中輸出index.blade.php13 14 15 <p>{{ $name }}</p>16 17 18 結果輸出:yuwenbo
使用php函式,blade模板允許我們使用原生的php,也可以在模板中使用函式及運算子
1 //模板中使用php函式 2 3 4 //輸出時間戳 5 <p>{{ time() }}</p> 6 7 //格式化當前時間 8 <p>{{ date('Y-m-d H:i:s', time()) }}</p> 9 10 //三元運算子11 <p>{{ in_array($name,$array) ? 'true' : false }}</p>
模板中短語法:{{ isset($age) ? $age : 'default value' }} 等同於 {{ $age or 'default value' }}
原樣輸出:
使用@{{ $count }}即可原樣輸出 ‘{{ $count }}’。
子檢視引入
使用@include關鍵字;例如在views下新建模板leftmenu.blade.php
1 @extends('common.base') 2 3 @section('header') 4 @parent 5 header 6 @stop 7 8 @section('leftmenu) 9 //引入子檢視10 @include('leftmenu')11 @stop
3、流程控制if判斷語句
1 //if流程判斷語句2 3 @if($user == 'admin')4 i am admin5 @elseif($user == 'yuwenbo')6 i am yuwenbo7 @else8 i am default9 @endif
for迴圈語句
1 //for迴圈語句2 3 @for($i = 1; $i <= 10; $i ++)4 <p>i is {{ $i }}</p>5 @endfor
foreach迴圈語句
1 //控制器 2 public function index() 3 { 4 $data_list = array('name' => 'yuwenbo', 'age' => 22, 'job' => 'php'); 5 6 return views('index', ['data' => $data_list]); 7 } 8 9 10 //檢視輸出11 @foreach($data as $key => $val)12 {{ $key }} => {{ $val }}13 @endforeach
1 //控制器 2 public function index() 3 { 4 $data_list = array( 5 array('name' => 'admin', 'age' => 20), 6 array('name' => 'word', 'age' => 18) 7 ); 8 9 return views('index', ['data' => $data_list]);10 }11 12 13 //模板輸出14 @foreach($data as $key => $val)15 <p>name is {{ $val->name }}, age is {{ $val->age }}</p>16 @endforeach
4、模板中使用url
url()-->通過路由的名字生成url
action()-->通過指定控制器及方法名生成url
route()-->通過路由別名生成url