1. 程式人生 > >[2018-01-12] laravel--路由(路由與控制器)

[2018-01-12] laravel--路由(路由與控制器)

body 管理 功能 edit eth let 界面 利用 outer

路由只用來接收請求

目前我們大致了解了laravel,在開始一個Http程序需要先定義路由。之前的例子中,我們的業務邏輯都是在路由裏實現的,這對於簡單的網站或web應用沒什麽問題,當我們需要擴大規模,程序變得復雜,分層的業務邏輯更為合適。這個時間,我們就應該使用控制器。

了解MVC的都對控制器的作用有所了解,控制器是實現主要業務邏輯的,在其他框架,控制器一般都是一個類,laravel也不例外,laravel的控制器其結構並沒有什麽特殊。

<?php 
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class HomeController extends Controller { /** * 顯示首頁。 * * @return Response */ public function index() { return view(‘home‘); } }

上述例子中就是laravel的控制器結構,沒什麽特別的。可以看得到,laravel的控制器非常的幹凈,與其他類的耦合度相當的低,得益於laravel的loc容器,我們很容易實現相當豐富的功能,且不會產生緊密耦合。那麽如何才能訪問到這個控制器裏的邏輯呢?

在上面的代理示例中,看到了一個十分簡單的控制器,但是要知道,定義了控制器你是無法直接使用的,要知道一個來自客戶點的請求會先經過路由,經過解析最終按照規則派發至具體的處理邏輯。

我們只是如何定義一個路由,但之前的路由裏包含了邏輯,我們如何將這個路由的邏輯轉到控制器呢?我們希望通過http://localhost/訪問我們上面例子中的HomeController類的index方法,應該定義一條這樣的路由。

Route::get(‘/‘, ‘HomeController@index‘);

例子很簡單,但是這種定義方法會帶來一種問題。

關於laravel的路由定義,很多人看到後都有一個疑惑:
每條地址規則都要定義路由,豈不是很累?
這個問題確實是個問題,不過,laravel給我們一個折中的方案--控制器路由。

控制器路由我認為只要是解決路由定義繁雜的情況,因為大型的應用業務比較復雜,控制器相當的多,我們不可能每一個控制器的方法都要定義一個路由。laravel的控制器路由可以這樣完美的解決問題:

Route::controller(‘/‘, ‘HomeController‘);

我們的控制器方法的寫法也要有所改變:

<?php 
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;

class HomeController extends Controller {

    /**
     * 顯示首頁。
     *
     * @return Response
     */
    public function getIndex()
    {
        return view(‘home‘);
    }

    /**
     * 顯示關於界面
     *
     * @return Response
     */
    public function getAbout()
    {
        return view(‘about‘);
    }
}

依照上述例子,如果我們訪問地址http://localhost/就會顯示HomeController的getIndex方法產生的內容,訪問http://localhost/about 就會顯示getAbout方法產生的內容。除了使用get{method}這種格式,還可以有post{Method}、delete{Method}等,至於前綴get、post等代表的意義,應該猜得到吧?

現在我們已經看到,這樣的英譯我們可以不用再給控制器的每一個方法定義一個路由,值需要給控制器定義一個路由即可。

//路由的基本格式

Route::get(‘/‘, function() { 

  //指的是訪問根目錄 然後返回Hello World
  return ‘Hello World‘;
})

路由常用寫法

//這個指訪問主頁的create頁面  會調用Article控制器下的create方法
Route::get(‘/create‘,‘ArticleController@create‘); 

//提交表單 action的位置為Article控制器下的store方法裏

Route::post(‘/store‘,‘ArticleController@store‘);

路由傳參

//指的是點擊show鏈接  將一個參數傳給Article控制器下的show方法 
Route::get(‘/show{id}‘,‘ArticleController@show‘);

//一般show方法就會這麽寫
public function show($id) {        //這個$id就是鏈接後面跟的參數
    //利用這個id 做點事情好吧...
}

路由的方法大總

//我們上面的方法相當於這裏的回調函數。
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

為路由命名

方法一:
Route::any(‘/create‘,[
    ‘use‘ => ‘ArticleController@create‘,    //回調函數
    ‘as‘ => ‘Article-create‘    //命名
]);
方法二:
Route::any(‘/create‘,‘ArticleController@create‘)->name(‘Article-create‘);

//命名的作用是為了在重定向或者其他的時候  很容易找到路由的url地址
$url = route(‘Article-create‘);
return redirect()->$url;    //這樣就很方便跳轉了

//如果地址有參數的話,還可以在後面直接加參數key=>value
Route::get(‘/article/{id}/edit‘, ‘ArticleController@edit‘)->name(‘edit‘);
return redirect()->route(‘edit‘, [‘id‘=>$id]);

路由分組

作用1 - - - 中間件

//比如在做登錄認證的時候 一般就會用到  auth  的中間件
Router::group([‘middleware‘=>‘auth‘], function() {
    Route::get(‘admin/index‘, ‘Admin/IndexController@index‘)
});
//這樣別人就必須登錄了 才能進到後臺界面  把所有的都可以調到這個路由組裏

作用2- - - 路由前綴

群組屬性 prefix 可以用來為群組中每個路由添加一個給定 URI 前綴
//比如做後臺管理系統  我麽就可以給路由添加一個路由前綴 admin
Route::group([‘prefix‘=>‘admin‘], function() {
    Route::get(‘index‘, ‘IndexController@index‘ )    //註意看 並沒有加前面的admin
//訪問的時候  還是需要(假設根目錄叫做shop.dev) 訪問 shop.dev/admin/index
//這樣才能訪問到這個路由
});

作用3- - - 命名空間

比如 在控制器文件夾下肯定有多個控制器,為了避免名稱的沖突我們可以給路由命名空間
 //    註意Admin是Controllers下的第一個文件夾
Route::group([‘namespace‘=>‘Admin‘], function() {   
    ...
});

[2018-01-12] laravel--路由(路由與控制器)