個人認為學 Laravel 最最最最重要的第一步就是 Routing
Routing 機制是決定如何處理 request 的重要角色
現在我們來了解一下 Laravel 的 Routing 機制吧
在我們建立 Laravel 專案後,會看到專案內長這個樣子
有好多資料夾和檔案的!!
然後我們需要用到的 route.php 就在 app/Http 裡
【基本路由】
打開 route.php , 我們可以看到 Laravel 已經有個簡單易懂的例子
這個例子的意思是
假設我們的網頁連結設成 website.com
那麼我們只要在瀏覽器輸入 website.com
就會顯示 Laravel 預設的歡迎畫面
假如我們想歡迎畫面設定成 website.com/welcome
然後想在 / print out "Hello World!" 這句
那只需要把 / 的 view 改成 return "Hello World!"; , 另外再加一個 /welcome 的 route 就可以了!
Route::get ( '/', function () {view('welcome') 指的是讀取在 resources/views 裡 welcome.blade.php 這個檔案
return "HelloWorld";
} );
Route::get ( '/welcome', function () {
return view ( 'welcome' );
} );
如果想普通的讀取 php, html 檔案
就在 route.php 的最開頭加上
return View::addExtension(‘html’,’php’);然後
Route::get ( '/index', function () { return File::get(public_path().’/pages/index.html’);} );public_path() 指的是讀取 public 路徑
如果我們想網站只能以HTTPS進入
Route::get('/', array('https', function()這樣我們就只能 https://website.com 進入了,不然就會顯示 Must be over HTTPS
{
return 'Must be over HTTPS';
}));
Route 的 method 除了我們熟悉的 GET 和 POST 外
還有以下很多種的
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
--------------------------------------
【透過URL傳遞參數】
假設我們開了 user.php ,裡面我們只是 echo $_GET['name'];
然後使用傳統的PHP GET去傳遞參數,我們的連結會長這樣
http://website.com/user.php?name=nightsnow
很長很不優美,被 user 都知道你用了什麼參數
而使用laravel的route功能,我們只需要
Route::get ('user/{name}', function ($name){
return "User ". $name;
});
加入這個在 route.php 後,在瀏覽器輸入 http://website.com/user/nightsnow
得出的結果就會是 User nightsnow 了!
連結會變得簡潔,而且 user 也不會知道我們的參數名稱
如果這個參數是選擇性的,可填可不填的
我們只需要在參數名稱後加 "?" ,例子如下
Route::get ('user/name/{name?}', function ($name = 'nightsnow'){
return "User". $name;
});
以上例子是給了一個 default 值給 $name
假如user真的沒傳參數過來時
$name 就等於 nightsnow 了
--------------------------------------
【為參數定義Regular Expression(正規表示式)】
Route::get ( 'user/{id}/{name?}', function ($id = 1, $name = "no name") {
return "User " .$id. " = " .$name;
} )->where(array('id' => '[0-9]+','name'=> '[A-Za-z]+'));
在這個例子中,意思就是 id 只能是數字,name 只能是英文字
除了定義指家路徑的 Regular Expression 外, 我們還可以定義全域的
例如很多 Route 都會用到 id 這個參數
而所有的 id 都只能是數字時
我們可以使用 pattern 指令
Route::pattern('id', '[0-9]+');這樣就不必在每個 Route 裡使用 where 來定義 Regular Expression 了!!
--------------------------------------
【為 Route 命名】
為 Route 命名,能方便我們管理,方便做 Redirect 等各項操作
使用 as 來命名
Route::get ( 'user/{id}/profile', [ 'as' => 'profile',function () {除了 as 外還可以使用 name 的
return 'profile';
} ] );
Route::get('user/{id}/profile’, 'UserController@showProfile')->name('profile');
controller 會在之後的文章再說明~
【Redirect 重新導向】
在進行 redirect 之前,我們要先把 Route 命名
例如我們有 beforeRedirect 和 afterRedirect 的 Route
Route::get ( 'beforeRedirect', [ 'as' => 'beforeRedirect',function () {
return redirect()->route('afterRedirect');
} ] );
Route::get ('afterRedirect', ['as' => 'afterRedirect', function (){
return "redirect success";
}]);
然後 redirect() 就是重新導向嚕~
上述例子中,如果在瀏覽器輸入並前往 http://website.com/beforeRedirect
那麼他將會重新導向至 http://website.com/afterRedirect
如果在畫面上出現 redirect success 這一句,就證明我們成功了!
假如我們 redirect 時需要傳遞參數
我們用命名的 profile route 來做例子
redirect()->route(‘profile’, [‘id’=>1]);這樣就是 redirect 到 profile route 以及傳遞 id 這個參數了!
--------------------------------------
【Route::group】
當有很多重覆開頭的 Route 時,我們可以用 Route::group 把他們包起來~
例如我們可能會有 user/{id}/profile, user/{id}/name 等等重覆了 user/{id} 的 Route
這時候我們就可以把重覆了的 user/{id} 抽出來放在 prefix 裡
然後用 Route::group 把剩下的包起來
Route::group(['prefix' => 'user/{id}'], function () {
Route::get('name', function ($id) {
echo "name id = ".$id;
});
Route::get('profile', function ($id) {
echo "profile";
});
});
沒有留言:
張貼留言