Laravel 5.2 二、HTTP路由、創建控制器 與 資源路由


一、HTTP路由

所有路由都定義在 App\Providers\RouteServiceProvider 類載入的 app/Http/routes.php文件中。

 

1. 基本路由

簡單的 Laravel 路由只接受一個 URI 和一個閉包

Route::get('foo', function () {
    return 'Hello, Laravel!';
});

 

對於常見的 HTTP 請求,Laravel 有以下幾種路由

Route::get($uri, $callback); //響應 get 請求
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

Route::match(['get', 'post'], $uri, $callback); //響應 get, post 請求
Route::any('foo', $callback); //響應所有請求

其中,$callback 可以是一個閉包,也可以是一個控制器方法。實際上,在開發中有不少情況是用作控制器方法的。

  

2. 路由參數

//單個路由參數
Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});
//多個路由參數
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});
//單個路由參數(可選)
Route::get('user/{id?}', function ($id = 1) {
    return 'User '.$id;
});
//多個路由參數(可選)
Route::get('posts/{post}/comments/{comment?}', function ($postId, $commentId = 1) {
    //
});
//注意:多個參數時,只可以對最后一個參數設置可選,其他位置設置可選會解析錯誤

// 正則約束單個參數
Route::get('user/{name?}', function ($name = 'Jone') {
    return $name;
})->where('name', '\w+');  //約束參數為單詞字符(數字、字母、下划線)

// 正則約束多個參數
Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

  

二、創建控制器

使用 Artisan 命令創建 php artisan make:controller UserController 

現在,在 app/Http/Controllers 這個控制器目錄下就生成了 UserController.php 的控制器文件。

 

三、高級路由

1. 命名路由

//命名閉包路由
Route:get('user', array('as' => 'alial', function(){}); 
//或 name 方法鏈
Route:get('user', function(){})->name('alias');

//命名控制器方法路由
Route:get('user', array('uses' => 'Admin\IndexController@index', 'as' => 'alias')); 
//或 name 方法鏈
Route:get('user', 'Admin\IndexController@index')->name('alias'));

 

2. 路由分組

2.1 路由前綴和命名空間

例如,有兩條指向控制器方法的路由

Route::get('admin/login', 'Admin\IndexController@login');
Route::get('admin/index', 'Admin\IndexController@index');

 

拿第一條來說,

參數一:admin/login  表示這個 URI 在請求網站根目錄下的 admin/login 資源,完整地址就是  http://域名/admin/login (這里開啟了 Apache 的路由重寫,隱藏了 “index.php“ ),這個請求被映射到第二個參數中指定的控制器方法。注意,網站根目錄是入口文件所在目錄,在 Laravel 中就是 public 目錄,配置服務器時最好也指向這里。

參數二:Admin\IndexController@login 表示這個控制器方法是在 App\Http\Controllers 命名空間下的,連起來就是 App\Http\Controllers\Admin\IndexController 控制器里的 login 方法。

 

顯然,兩條路由的 URI 和 控制器方法 都有相同的部分,那么,啟用路由分組可以提取出公共部分:

// 第一個數組參數中,prefix 鍵定義 URI 的公共部分,namespace 鍵定義方法名(命名空間語法)的公共部分
Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function(){
    Route::get('login', 'IndexController@login');
    Route::get('index', 'IndexController@index');
});

 

2.2 資源路由

資源路由就是映射到資源控制器的路由,Laravel 資源控制器內置了對資源增刪改查的 7 個方法以及 7 條路由。

首先,創建資源控制器 ArticleController

php artisan make:controller Admin/ArticleController  --resource

這樣就生成了資源控制器在 app/Http/Controllers/Admin/ArticleController.php 文件(Admin 文件夾不存在時會自動創建),內置的 7 個方法如下 :

<?php

namespace App\Http\Controllers\Admin;

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

class LinksController extends Controller
{
    /**
     * 顯示一個資源的列表
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * 顯示一個表單來創建一個新的資源
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * 保存最新創建的資源
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * 顯示指定的資源
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * 顯示一個表單來編輯指定的資源
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * 更新指定的資源
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * 刪除指定的資源
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

 

然后,定義資源路由 這里我還是選擇在路由分組下定義,定義一條就好

Route::group(array('prefix' => 'admin', 'namespace' => 'Admin'), function(){ 
    Route::get('login', 'IndexController@login');
    Route::get('index', 'IndexController@index');
    // 資源路由
    Route::resource('article', 'ArticleController');
});

  

最后,查看路由。有了資源控制器 和 資源路由,就可以看一下對以上 7 個方法的 HTTP 請求方式了。

使用 Artisan 命令 php artisan route:list  列出當前的所有路由,請求方式、URI、控制器方法、中間件都羅列出來了。

推薦閱讀:有關 Laravel 的 HTTP 路由知識點還有 路由模型綁定、表單方法偽造 和 CSRF 保護等知識,詳細請參考 Laravel 手冊-HTTP路由功能

相關閱讀:URI 和 URL 的區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM