2016年9月7日 星期三

【Laravel】基礎入門 (1) - Routing

使用 Laravel, 不得不提及的一定就是 Routing 了
個人認為學 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 () {
return "HelloWorld";
} );
Route::get ( '/welcome'function () {
return view ( 'welcome' );
} );
view('welcome') 指的是讀取在 resources/views 裡 welcome.blade.php 這個檔案
如果想普通的讀取 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()
{
return 'Must be over HTTPS';
}));
這樣我們就只能 https://website.com 進入了,不然就會顯示 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(正規表示式)】

為參數定義 Regular Expression, 需要使用 where 指令
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 () {
return 'profile';
} ] );
除了 as 外還可以使用 name 的
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";
});
});

沒有留言:

張貼留言