1、laravel簡介
laravel是一套優雅簡介的PHP開發框架,受歡迎程度很是之高,功能強大,工具齊全;如下是本人在學習過程當中記錄的laravel比較基礎的資料,權當學習筆記,請大神們多多指教php
2、版本選擇
本篇學習筆記以laravel5.2.15版本爲框架的版本基礎;更多版本請移步https://www.golaravel.com/css
3、laravel下載安裝以及開發環境搭建
(一):環境搭建
因爲laravel使用較多的php新特性,因此新版本的laravel對PHP的版本要求比較高,這裏選擇的laravel5.2.15要求 PHP>5.5.9+ 。Win系統下推薦使用集成的開發環境好比wamp、phpStudy、Xampp均可以,下載安裝的時候須要注意PHP版本,Linux系統下須要編譯安裝,這裏推薦一篇博客https://www.linuxidc.com/Linux/2016-10/136327.htm(ubuntu下lamp開發環境搭建)。本篇學習筆記也是基於lamp環境下html
(二):下載、安裝及大體介紹
一、安裝包下載安裝
本來laravel中文網是能夠下載一鍵安裝包的,可是等我去下載的時候發現沒地方能夠下載,也只能經過度娘找其它下載資源下載安裝包而後安裝;個人資源:https://github.com/yuwenbo5/laravel5.2.15.git;下載安裝包後解壓更更名稱(laravel),直接拷貝到環境根目錄www(win下wamp環境)或者 /var/www/html(linux下lamp環境)中;打開瀏覽器輸入url:localhost/laravel/public 而後回車,出現以下畫面表示安裝成功:mysql
二、composer安裝
cd到環境根目錄,使用命令:composer create-project --prefer-dist laravel/laravel=5.2.15 laravel(項目名稱,可修改)
linux
三、簡單介紹
laravel是基於mvc模式的php框架,m——模型層,v——視圖層,c——控制器層;如下爲laravel框架的目錄文件,框出來的文件目錄將在後續中用到:laravel
app是應用的核心代碼文件目錄,之後的代碼基本都在這裏完成;app/Http/Controller目錄是應用的控制器文件;routes.php是框架的路由文件,負責路由分配和映射;Http下的類文件,好比上面目錄中的User.php、Menu.php文件是應用的模型文件;config目錄是全部應用的配置文件目錄;public是框架的入口文件及靜態資源文件目錄;resources/views則是應用的視圖文件目錄。git
4、laravel路由
(一):簡介
用過thinkPHP的開發者都知道,傳統的MVC的url都是對應應用的控制器及控制器中的方法,laravel中的MVC則是經過路由功能映射到對應的程序(控制器方法),經過路由將用戶的請求發送到對應的程序進行處理,其做用就是創建url和處理程序之間的映射關係,這樣作有一個好處,對url進行美化只須要修改路由而無需對程序自己進行修改。github
laravel中請求類型包括:get、post、put、patch、delete。正則表達式
前面說了route.php是laravel的路由文件,全部的路由映射都要經過編輯route.php文件進行代碼書寫。sql
(二):路由學習
一、基本路由
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_base 11 頁面輸出: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
二、多請求路由
顧名思義,多請求路由則是能夠經過多種請求方式進行請求,多請求路由主要有兩種方式,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/multi 10 此路由可經過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/multi 11 請求返回字符串:multi get or post
三、路由參數
給路由綁定參數,接收參數進行處理
(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/yuwenbo 11 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/username 10 輸出:userid is username 11 12 訪問url:http://127.0.0.1/laravel/public/user 13 輸出:userid is 14 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/5 13 返回輸出:this num is 5 14 15 訪問url:http://127.0.0.1/laravel/public/num 16 返回輸出:this num is 15 17 18 訪問url:http://127.0.0.1/laravel/public/num/fhdja 19 頁面報錯 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 可以使用數組形式過濾多個參數
四、路由別名
給路由經過['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/info 14 頁面返回:http://127.0.0.1/laravel/public/student/info 15 16 注:別名的好處在於,之後在控制器中使用route('別名')的方式生成url後,即使修改了路由的名字,也不用再修改控制器程序,由於經過別名程序能自動生成修改後的url
五、路由羣組
經過關鍵字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/info 10 Route::get('student/info',['as' => 'studentInfo' ,function(){ 11 return route('studentInfo'); 12 }]); 13 14 //此時的訪問地址:http://127.0.0.1/laravel/public/admin/info/yuwenbo/20 15 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必需要加上羣組前綴,不然將不能訪問
六、路由中輸出視圖
經過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/public 14 瀏覽器顯示laravel的歡迎界面 15 16 17 //作以下修改 18 Route::get('welcome',function(){ 19 return view('welcome'); 20 }); 21 22 修改後訪問url:http://127.0.0.1/laravel/public/welcome 23 瀏覽器一樣顯示laravel的歡迎界面
通常狀況是不會在路由中輸出視圖的。
5、控制器
控制器目錄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 Controller 12 { 13 public function index() 14 { 15 return view('admin/index'); 16 } 17 } 18 19 20 新建控制器AdminController繼承於基類Controller
一、路由關聯控制器,經過路由訪問控制器程序:
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 ]);
二、路由關聯控制器進行參數綁定:
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.php 14 <?php 15 /** 16 * Created by PhpStorm. 17 * User: Administrator 18 * Date: 2018/8/25/025 19 * Time: 0:51 20 */ 21 namespace App\Http\Controllers; 22 23 class AdminController extends Controller 24 { 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/5 34 頁面輸出:num is 5
6、模型
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 Model 13 { 14 public static function getAdmin() 15 { 16 return 'this is admin model static getAdmin action'; 17 } 18 19 } 20 21 ?> 22 23 24 //控制器文件 AdminController.php 25 <?php 26 /** 27 * Created by PhpStorm. 28 * User: Administrator 29 * Date: 2018/8/25/025 30 * Time: 0:51 31 */ 32 namespace App\Http\Controllers; 33 34 class AdminController extends Controller 35 { 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=http://localhost 5 6 //mysql鏈接配置 7 DB_CONNECTION=mysql 8 DB_HOST=localhost 9 DB_PORT=3308 10 DB_DATABASE=shop 11 DB_USERNAME=root 12 DB_PASSWORD=root 13 14 CACHE_DRIVER=file 15 SESSION_DRIVER=file 16 QUEUE_DRIVER=sync 17 18 REDIS_HOST=127.0.0.1 19 REDIS_PASSWORD=null 20 REDIS_PORT=6379 21 22 MAIL_DRIVER=smtp 23 MAIL_HOST=mailtrap.io 24 MAIL_PORT=2525 25 MAIL_USERNAME=null 26 MAIL_PASSWORD=null 27 MAIL_ENCRYPTION=null
一、使用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 Controller 15 { 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', 'example@mail.com', '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仍是比較熟的。
二、使用查詢構造器操做數據庫
使用查詢構造器進行數據庫操做使得操做簡介、方便,示例使用上面的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 Controller 15 { 16 17 public function query() 18 { 19 //插入一條數據 20 $bool = DB::table('user')->insert( 21 ['username' => 'yuwenbo', 'email' => 'example@mail.com', 'sex' => 1] 22 );//返回布爾值 23 24 //插入一條數據返回插入的id 25 $insert_id = DB::table('user')->insertGetId( 26 ['username' => 'yuwenbo', 'email' => 'example@mail.com', 'sex' => 1] 27 ); 28 29 30 //插入多條數據 31 $bool = DB::table('user')->insert([ 32 ['username' => 'yuwenbo', 'email' => 'example@mail.com', 'sex' => 1], 33 ['username' => 'tom', 'email' => 'example@mail.com', '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 Controller 16 { 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');//自增1 25 $rows = DB::table('user')->where('username','admin')->increment('sex',$n);//自增n 26 27 $rows = DB::table('user')->where('username','admin')->decrement('sex');//自減1 28 $rows = DB::table('user')->where('username','admin')->decrement('sex',$n);//自減n 29 30 //自增同時修改其它內容 31 $rows = DB::table('user')->where('username','admin')->increment('sex', 3, ['email' => '4546464684@mail.com']);//自增同時修改內容 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 Controller 15 { 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 Controller 15 { 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 //返回結果集中指定的字段pluck 32 $usernames = DB::table('user')->whereRaw('id >= ? and sex = ?', ['5' ,'1'])->pluck('username'); 33 34 //返回指定字段的下標lists 35 $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 //每次查指定的條數chunk 41 DB::table('user')->chunk(2, function($user_list){ 42 dd($user_list); 43 }); 44 45 } 46 47 }
mysql中的聚合函數對應的構造器方法count()、max()、min()、avg()、sum(),使用都比較簡單也很好理解,這裏再也不贅述
7、視圖
laravel框架的視圖支持原生的php文件,視圖的目錄 resources/views;
命名:統一以.php爲後綴的PHP文件,規則:視圖名+.+blade,例如新建一個視圖文件:index.blade.php
通常狀況下一個控制器會建一個視圖目錄,例如AdminController控制器,咱們將在views下新建一個admin目錄
(一)、新建視圖
1 //模板文件 views/admin/index.blade.php 2 3 this is views/admin/index.blade
(二)、輸出視圖
1 //路由文件 2 <?php 3 //綁定控制器方法 4 Route::get('admin/index', 'AdminController@index'); 5 6 ?> 7 8 9 //控制器文件 AdminController.php 10 <?php 11 /** 12 * Created by PhpStorm. 13 * User: Administrator 14 * Date: 2018/8/25/025 15 * Time: 0:51 16 */ 17 namespace App\Http\Controllers; 18 19 class AdminController extends Controller 20 { 21 public function index() 22 { 23 return view('adminindex');//傳入要輸出的模板名便可 24 } 25 } 26 27 訪問url:http://127.0.0.1/laravel/public/admin/index 28 頁面顯示:this is views/admin/index.blade
輸出視圖時能夠攜帶變量而後在模板中輸出出來,這點將在後面的模板的詳細使用中用到;
(三)、模板詳解
一、模板繼承
因爲多數頁面有相同部分,因此使用模板繼承簡化模板使用;如下首先在views/common下新建一個基本的公共模板文件base.blade.php,公共的模板文件放在views/common文件夾下
在views下新建首頁index.blade.php繼承公共模板文件
模板繼承語法:@extends('目錄.文件名');例如:@extends('common.base'),就能夠繼承common目錄下的base.blade.php模板
使用@section重寫子模板,使用@yield展現某個指定的section的內容;
@yield不能被子模板擴展,@section能夠被子模板擴展
若是須要展現父模板內容,可以使用@parent;例如:
1 @extends('common.base') 2 3 @section('header') 4 @parent 5 header 6 @stop
二、基礎語法及使用
輸出變量,使用{{ $變量名 }},以下所示:
1 //例如控制器中 2 3 public function index(){ 4 5 return view('index',['name' => 'yuwenbo']); 6 7 } 8 9 11 12 //模板中輸出index.blade.php 13 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
三、流程控制
if判斷語句
1 //if流程判斷語句 2 3 @if($user == 'admin') 4 i am admin 5 @elseif($user == 'yuwenbo') 6 i am yuwenbo 7 @else 8 i am default 9 @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
四、模板中使用url
url()-->經過路由的名字生成url
action()-->經過指定控制器及方法名生成url
route()-->經過路由別名生成url
1 //路由 route.php 2 3 Route('index',[ 4 'uses' => 'IndexController@index', 5 'as' => 'in' 6 ]); 7 8 9 10 //模板中生成url的方式 11 12 <a href="{{ url('index') }}">url方式</a> 13 14 <a href="{{ action('IndexController@index') }}">action方式</a> 15 16 <a href="{{ route('in') }}">route方式</a> 17 18 19 //以上三種方式均生成url: 20 http://127.0.0.1/laravel/public/index
以上三種方式在實際使用時均可以用,通常狀況下,使用url()和route()較多,由於寫法簡介方便
=================================================================================================================================