1、路由目錄php
衆所周知,對於咱們熟知的任何一款PHP框架,例如TP、CI、YII、路由系統都是極其重要的存在。 對於laravel框架也同樣,對於數據庫的操做,無非就是增刪改查,只不過框架不一樣,語法不一樣, 因此掌握laravel框架的路由系統對於咱們掌握該框架有着相當重要的做用。 咱們知道對於LARAVEL框架之前的版本,路由都是寫在app裏的,如今的laravel框架路由存在在Routes目錄下,以下圖所示:
全部的 Laravel 路由都在 routes 目錄中的路由文件中定義,這些文件都由框架自動加載。 routes/web.php 文件用於定義 web 界面的路由。 這裏面的路由都會被分配給 web 中間件組,它提供了會話狀態和 CSRF 保護等功能。 定義在 routes/api.php 中的路由都是無狀態的,而且被分配了 api 中間件組。 咱們先來熟悉一下HTTP訪問的幾種方法: 1. Get方法:經常使用的方法,略; 2. Post方法:經常使用的方法,略; 3. Head方法:與get方法相似,主要是爲了獲取某個訪問的頭部信息, 服務器不返回請求內容; 4. PUT方法:請求往服務器上存文件; 5. DELETE方法:請求刪除服務器上的文件; 6. TRACE方法:就是獲取服務器收到的來自客戶端的請求信息(收發調試), 通常用於調試服務器; 7. Connect方法:把服務器做爲跳板,讓服務器代替用戶去訪問其它網頁, 以後把數據原本來本的返回給用戶; 8. Options方法:獲取服務器URI所支持的方法,或用於檢查服務器的性能, ajax進行跨域訪問時,先發送options方法來判斷請求是否安全。
2、熟悉路由laravel
咱們先寫幾個簡單的路由來認識一下Laravel下的路由路徑。 在開始練習以前,咱們先關閉routes/web.php 下的下面兩行auth相關代碼,避免影響練習測試。 //Auth::routes(); //Route::get('/home', 'HomeController@index')->name('home');
此刻咱們訪問127.0.01:9999/news時,顯示的應該是NEWS字樣。 接下來咱們來給數據表中填充十組數據,而後創建Model類以及控制器,經過路由來訪問這些數據。(這裏就不經過laravel自帶的 seed 填充了,有興趣的朋友能夠自行查詢怎麼填充模擬數據.關鍵字"laravel seeder")。表結構以下圖所示
使用artisan命令創建Model類,打開cmd 切換到項目根目錄,輸入php artisan make:model News 獲得以下圖所示
打開app/News.php 文件,因爲laravel默認Model類對應的表名爲類名加s,既對應的表應該是newss,咱們在文件中加入protected $table = 'News',指定該model類對應表news。 咱們再使用artisan創建控制器. php artisan make:controller IndexController 成功以後,打開app/Http/Controllers/IndexController.php ,測試成功。
加入路由
測試成功
web
至此說明咱們已經能夠經過路由訪問通控制器, 接下來咱們來使用Eloquent ORM 來調取數據庫數據。
如上圖,須要在文件頭部引入對應Model類
use AppNews ,而後 在方法Index裏調用News::all() Eloquent方法,而後展現出數組模式,toArray();
ajax
除此以外,咱們還可使用DB類的靜態方法來和數據庫進行交互。 <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\News; use DB; class IndexController extends Controller { public function index() { // echo '測試成功!'; // var_dump(News::all()->toArray()); $news = DB::table('news')->get(); var_dump($news); } }
以上只是數據庫最簡單的展現方法,具體的增刪改查咱們會在下節教程繼續學習,如今咱們再回過頭來,看看路由的幾種規則。
一、路由的match、any方法
/*
match方法是laravel本身封裝好的,一樣它的意思是匹配
*/數據庫
Route::match(['get,post],'admin/login',function(){ return 'login'; });
/*
在這裏呢咱們能夠用match這個方法去匹配兩種請求方式,這樣是否是減小了代碼量呢
*/
咱們還有第二種方法,
/*
GET,POST,PUT,DELETE.. 任何方法訪問 www.itbool.com/Admin/login, 都用第2個參數中的匿名函數去響應全部HTTP動做 .
*/api
Route::any('Admin/login',function(){ return 'hello world'; });
二、路由傳參
Laravel的路由傳參參數必須使用花括號來包裹而且是拼音字母例如使用{id}表示$id參數,具體示例以下圖所示:
跨域
三、路由正則約束
即當咱們要驗證一些字段的時候,在laravel中,咱們能夠直接在路由中做出限制。
普通形式
->where('要限制的參數名','限制規則(正則,不用斜線//)');
數組形式
->where(['要限制的參數名1'=>'限制規則1(正則,不用斜線//)','要限制的參數名2'=>'限制規則2(正則,不用斜線//)']);
以下圖所示:
數組
四、資源路由
例如:咱們先用artisan命令,生成一個控制器:安全
php artisan make:controller PhotoController --resource
(artisan命令還有不少,能夠極大地提升咱們的開發速度)
接下來爲這個控制器註冊一個資源路由:服務器
Route::resource('photo','PhotoController');
此時打開cmd命令行 輸入php artisan route:list ,能夠看到以下圖
這個路由聲明建立多個路由來處理資源上的各類行爲。生成的控制器爲每一個行爲保留了方法,
同時還包括了 處理 HTTP 動做和 URI 的聲明註釋。
這裏須要注意的是由於 HTML 表單不能生成 PUT、 PATCH 或者 DELETE 請求,因此你須要添加一個隱藏的 _method 輸入字段來僞造這些 HTTP 動做。輔助函數 method_field 能夠幫你建立這個字段:
{{ method_field('PUT') }}
或者在表單中加入像這樣
<input type="hidden" name="_method" value="put">
表單提交方式不須要變,依舊是 method='POST'便可。
五、控制器路由(5.3之後已經取消了,再也不贅述)
每條地址規則都要定義路由,豈不是很累,laravel有一個控制器路由,很好的解決了這個問題。
Route::controller('/example', 'ExampleController'); (5.3已棄用)
六、路由組
在不少模塊操做中咱們須要把路由分組,對於他們進行權限分組限制,這時候咱們就可使用路由組結合中間件Middleware來進行簡單的限制。
1)創建中間件
首先咱們在應用根目錄下運行以下Artisan命令生成一個測試用的中間件TestMiddleware:
php artisan make:middleware TestMiddleware
這樣會在/app/Http/Middleware目錄下生成一個TestMiddleware.php文件,
打開該文件編輯TestMiddleware類的handle方法以下:
public function handle($request, Closure $next) { if($request->input('age')<18) return redirect()->route('refuse'); return $next($request); }
咱們在中間件中定義這段業務邏輯的目的是年齡18歲如下的未成年人不能訪問。
2)新增中間件屬性
而後咱們打開/app/Http/Kernal.php文件,新增TestMiddleware到Kernel的$routeMiddleware屬性:
test' => \App\Http\Middleware\TestMiddleware::class,到數組中去
3)定義路由組
Route::group(['middleware'=>'test'],function(){ Route::get('/write/laravelacademy',function(){ //使用Test中間件 }); Route::get('/update/laravelacademy',function(){ //使用Test中間件 }); }); Route::get('/age/refuse',['as'=>'refuse',function(){ return "未成年人禁止入內!"; }]);
此時,咱們訪問127.0.0.1:9999/write/laravelacademy?age=15時候,
就會自動跳轉到http://127.0.0.1:9999/age/refuse。