2019年7月28日 星期日

Laravel 5.8入門教學【第一篇】路由(Routing)

基礎路由

最基礎的Laravel路由(Routing)由一個URI和閉包(Closure)組成,是一個簡單且容易理解的定義路由方法:
Route::get('foo', function () {
    return 'Hello World';
});

預設的路由檔案
所有Laravel路由都在路由檔案內定義,並存放在在目錄 routes,框架會自動被載入這些檔案,檔案routes/web.php定義web層的路由,這些路由被歸類到web中介軟體(middleware)提供session state和CSRF protection;而在routes/api.php是stateless,屬於api這個middleware。

在大部分的應用裡,你會從檔案routes/web.php開始定義路由,檔案routes/web.php內的路由將可以透過定義的URL在瀏覽器開啟,例如:你可以在瀏覽器存取下列的路由http://your-app.test/user
Route::get('/user', 'UserController@index');
檔案routes/api.php內的路由在RouteServiceProvider被設定成一個路由群組(Route group),在這個組裡,所有的路由將自動補上前綴(prefix)/api,不需要手動在每個路由設定,可以在RouteServiceProvider修改前綴,或定義其他路由組。
※路徑:./app/Providers/RouteServiceProvider.php

提供的路由方法(Available Router Methods)
提供你註冊路由來回應任何HTTP的動作(verbs):
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
有時你可能需要註冊一個可以回應多種HTTP動作的路由,你可以使用match,或你也可以透過any來註冊一個回應所有HTTP動作的路由。
Route::match(['get', 'post'], '/', function () {
    //
});

Route::any('/', function () {
    //
});

CSRF保護機制
任何HTML的表單只要是指向POSTPUTDELETE的路由,都需要一個CSRP的欄位,否則,請求將被回拒,你可以在CSRF documentation了解更多關於CSRF protection。
<form method="POST" action="/profile">
    @csrf
    ...
</form>

重新導向路由(Redirect Routes)
如果要定義一個路由會重新導向到其他URI,你可以使用Route::redirect,這個方法提供一個方便的捷徑,讓你不需要定義完整的路由或控制器(controller)來實現簡單的重新導向:
Route::redirect('/here', '/there');
預設情況,Route::redirect會回傳302的HTTP狀態碼(HTTP status code),你可以用第三個可選參數來自訂狀態碼:
Route::redirect('/here', '/there', 301);
你也可以用Route::permanentRedirect來回傳301的狀態碼:
Route::permanentRedirect('/here', '/there');

視圖路由(View Routes)
如果你的路由僅需回傳一個視圖(view),你可以使用Route::view,就像是redirect,這個方法提供一個簡單的捷徑免於定義完整的路由和控制器,view這個方法可以傳入URI當作第一個參數,用第二個參數為此路由命名。此外,第三個非必選的參數可以傳入一個陣列的資料給視圖使用。
Route::view('/welcome', 'welcome');

Route::view('/welcome', 'welcome', ['name' => 'Taylor']);


路由參數

必填的參數(Required Parameters)
有時你需要擷取URI的一部份,例如:你需要從URL獲得使用者的ID,你可以這樣定義路由參數:
Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});
你可以在路由中視需求定義多個路由參數:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
    //
});
路由參數必須被{}包起來,名稱為字母組成並不能有-,可以使用底線(_)來取代-,路由參數將會按照順序傳入路由的回調(callbacks)/控制器(controllers),因此取名不重要可以自行定義。

選填的參數(Optional Parameters)
偶爾你需要一個特定的路由參數,但希望這個參數不是一個必填的欄位,你可以放置?的標記在參數名稱後,最後請確定你為路由參數設定了一個相應的預設值。
Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});

關係表示式限制
你可以使用where對路由參數的模式賦予限制,方法where傳入參數的名稱和一個定義限制為何的關係表示式(Regular Expression):
Route::get('user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

全域限制(Global Constraints)
如果你希望路由參數可以一直遵守給定的限制,你可以使用pattern,你可以在檔案RouteServiceProviderboot方法裡定義這些模式:
/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}
一旦這些模式被定義,將會自動應用到所有使用這個參數名稱的路由:
Route::get('user/{id}', function ($id) {
    // Only executed if {id} is numeric...
});

編碼正斜杠(Encoded Forward Slashes)
Laravel路由允許任何字元,除了/,你必須使用where設定關係表達式(regular expression),明確地開放/納入佔位符(placeholder)的一部份。
Route::get('search/{search}', function ($search) {
    return $search;
})->where('search', '.*');
[!] 編碼正斜杠只對路由的最後一個部份有效


命名路由

命名路由(Named routes)讓產生URLs或重新導向到特定的路由變得方便,你可以透過name連結到路由的定義來指定一個名稱給路由。
Route::get('user/profile', function () {
    //
})->name('profile');
你也可以為控制器動作(controller actions)指定路由名稱:
Route::get('user/profile', 'UserProfileController@show')->name('profile');

產生命名路由的URLs(Generation URLs To Named Routes)
一旦你為路由設定名稱,你可以用這個路由名稱產生URL或使用函式route重新導向:
// Generating URLs...
$url = route('profile');

// Generating Redirects...
return redirect()->route('profile');
若這個命名路由有參數(parameters),你可以在函式route作為第二個傳遞參數,參數將會自動在正確的位置插入URL。
Route::get('user/{id}/profile', function ($id) {
    //
})->name('profile');

$url = route('profile', ['id' => 1]);

檢查目前的路由(Inspecting The Current Route)
如果你需要確認目前的請求要引導的命名路由,你可以在Route的實例中使用named方法,例如:你可以在路由中介軟體確認路由名稱。
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
        //
    }

    return $next($request);
}


路由群組(Route Groups)

路由組可以允許大量的路由共用路由的屬性,像是中介軟體〈middleware〉或命名空間〈namespaces〉,而非在路由中個別獨立設定。共用的屬性以陣列格式作為Route :: group方法的第一個參數。

中繼軟體(Middleware)
你可以在路由群組的定義之前,用middleware將群組的所有路由設定中繼軟體,中間軟體將按照它們列出的順序執行:
Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
        // Uses first & second Middleware
    });

    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
});


取得現在的路由

你可以使用currentcurrentRouteNamecurrentRouteAction這些Route方法,取得關於路由的資訊來處理進來的請求。
$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

文章來源:https://laravel.com/docs/5.8/routing

2019年7月26日 星期五

Ubuntu18+PHP7.2 安裝Laravel 5.8


安裝composer

Composer是PHP套件管理工具,請參考『[Symfony] ubuntu18安裝symfony 4.2教學』第二部分提供兩種安裝方式。[官方安裝說明]


建立專案

提供兩個方式來建立一個專案,命名為 blog
方法一、
composer create-project --prefer-dist laravel/laravel blog
指令執行後會自動 composer install 讀取 composer.json 安裝所需及相依的套件。

方法二、
composer global require "laravel/installer"
2-A. 把 $HOME/.composer/vendor/bin 路徑放置於環境變數 $PATH 裡。
export PATH="~/.config/composer/vendor/bin:$PATH"
laravel new blog
2-B. 如果沒有設定環境變數,可能會有錯誤訊息laravel: command not found,也可以用決定路徑來執行。
# "沒有"設定環境變數
.config/composer/vendor/bin/laravel new blog


兩個方法二擇一,成功後目錄應該會多一個 blog/ 的專案目錄,進入專案並執行:
php artisan key:generate

# Example oupout
Application key set successfully.
如果沒有執行這一段,執行專案可能會跳出錯誤訊息 No application encryption key has been specified.


執行專案

開發時可以執行下面的指令讓專案運作,預設路徑為http://localhost:8000
php artisan serve
也可以指定 HOSTPORT
php artisan serve --port=8080 --host=192.168.88.139


打開瀏覽器看到下面的畫面,就可以進入開發囉!



查詢Laravel安裝版本
php artisan -V
Laravel Framework 5.8.29


參考資料:
https://laravel.com/docs/5.8