Laravel-Controller 控制器

控制器Controller

關於Controllers

都存放於app\Http\Controllers

可建⽴⼦資料夾

⽤於協同管理Model.View

建⽴Controller的指令

php artisan make:controller Controller名稱

複習關於routes/web.php

負責定義網⾴請求路由的⼯作

格式:Route::get(‘contact’, ‘App\Http\Controllers\WelcomeController@contact’);

//請求⽅法 偵聽URL路徑 負責的Controller 接⼿的⽅法

• 可使⽤.來對應到⼦資料夾 • 規則判定由上⾄下逐⼀比對,只要符合路徑就傳遞給控制器 • 8.x版本的控制器因前綴預設為空,所以需要補上命名空間


為什麼8.x以前不需要寫

App\Http\Controllers?

因為RouteServiceProvider.php設定了此命 名空間,但8.x開始預設為null


複習新增Controller的細節

建⽴⼀個不帶⽅法的Controller

php artisan make:controller Controller名稱


關於View

負責畫⾯的呈現描述,位於resources/views

public function about(){
return view('about');
}

將視圖放在⼦資料夾

如想將視圖檔⽤⼦資料夾分類,可使⽤.語法

public function about(){
return view(‘pages.about’);
//回傳pages⼦資料夾的about.blade.php
}

View的內容

• 內容包含html與Blade標籤 • 檔名中⼀定包含blade • 例如:game.blade.php


透過Controller傳值

• 新增變數並賦值 • 傳送語法以下三種 • with函數 • view函式第⼆參數 • compact函數

//PagesController.php

namespace App\Http\Controllers;

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

clsaa PagesController extends Controller
{
    public function about()
    {
    $name = 'boy';
    //compact函數
    return view('pages.about', compact('name'));
    //with函數
    return view('pages.about')->with('name',$name);
    }
}

透過Controller傳多筆數值

class PagesController extends Controller
{
$name = 'Pony <span style="color:red">兒</span>';

return view('pages.about',compact('name'));

//with函數
return view('pages.about')->with([
"first" => "p";
"last" => "ony";
]);

//view函式第⼆參數
$data = [];
$data["first"] = "p";
$data["last"] = "ony";
return view("pages",$data);

//compact函數
$first = "p";
$last = "ony";
return view('pages.about',compact("first","last"));
}

View接收Controller的 傳值

• 接收語法以下兩種

• {{ $name }}

• {!! $name !!}

//about.blade.php
//{{ }} 內容顯示都為文字
//{!! !}針對內容有Html需要呈現時⽤

<!doctype html>
<html>
<head>
</head>
<body>
<h1>標題:{{$first}}</h1>
<p>文章內容:{!!$last!!}</>
</body>
</html>

View接收多筆數值

//about.blade.php
//針對內容有Html需要呈現時⽤

<!doctype html>
<html>
<head>
</head>
<body>
<h1>標題:{{$first}}{{$last}}</h1>
<p>文章內容:</>
</body>
</html>

控制器傳值⽰範

Resources Controller

複習新增Controller的細節

建⽴⼀個帶CRUD⽅法的Controller

php artisan make:controller Controller名稱- -resource - -model=模型名

//路由規則設定

Route::resource('photos', ‘PhotoController'); 

Route::resources([
 'photos' => 'PhotoController',
 'posts' => 'PostController'
]);

被資源控制器所處理的Actions

動詞 路徑 Action 路由名稱
GET /photos index photos.index
GET /photos/create create photos.create
POST /photos store photos.store
GET /photos/{photo} show photos.show
GET /photos/{photo}/edit edit photos.edit
PUT/PATCH /photos/{photo} update photos.update
DELETE /photos/{photo} destroy photos.destroy

資源控制器路由⽰範

新增API的Controller的細節

建⽴⼀個帶CRUD⽅法的Controller,但不包含create和edit

php artisan make:controller APIController名稱- -api

//路由規則設定

Route::apiResource('photos', 'PhotoController');

Route::apiResources([
 'photos' => 'PhotoController',
 'posts' => 'PostController'
]);

Controller 進階技巧

加入中介層

//控制器可在建構⼦宣告哪些Action要加⼊

class UserController extends Controller
{
 public function __construct()
 {
 $this->middleware('auth');
 $this->middleware('log')->only('index');
 $this->middleware('subscribed')->except('store');
 }
}
//路由可在規則後⾯加⼊中介層

Route::get(‘profile','UserController
@show')
->middleware('auth');

如何讓控制器的Action需要登入才能訪問?

//加⼊auth中介層可受到登⼊限定保護

class UserController extends Controller
{
 public function __construct()
 {
 ….
 $this->middleware('auth');
 }
}

控制器Action的登入保護⽰範

為什麼要把邏輯寫在Controller⽽ 非Route?

• ⽅可啟⽤Cache機制,可增速100倍

• 符合MVC架構


⽣成網⾴路徑Helper Function

url()可根據路徑⽣成網址

url( ‘route path’ )

route()可根據路由名稱⽣成網址

route(‘route.name’,[‘id’=>1])


傳值程式碼

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    public function signup(Request $request , $id , $course)
    {
        $data = ['id' => $id , 'course' => $course , 'url' => '<a href="http://goblinlab.org">http://goblinlab.org</a>'];
        $url =  '<a href="http://goblinlab.org">http://goblinlab.org</a>';
        
        //作法1 利用view()的第2參數來傳
        return view('signup',$data);
        
        //作法2 利用with()方法來傳
        return view('signup')->with($data);
        
        //作法3 搭配compact()來建立陣列
        return view('signup',compact('id','course','url'));
    }
}

視圖接收參數寫法

跳脫程式內容來進行輸出 {{ $id }} <br>

會渲染程式內容並執行來進行輸出 {!! $code !!}<br>

路由的寫法

//8.x以上版本需補上命名空間
Route::get('/users/{id}/courses/{course}', 'App\Http\Controllers\HomeController@signup');

建立帶resources方法的控制器

php artisan make:controller ItemController --resource --model=Item

–resource 表示希望順便生成7個CRUD方法
–model 表示希望順便加入載入Model的程式碼,可自己加

建立resources 路由

//建立單一表格resource
Route::resource('items','App\Http\Controllers\ItemController');

第一參數為路徑前綴,通常與關連表格名稱相同 第二參數為所接手的控制器名稱

/建立多個表格的resource
Route::resources([
    'items' => 'App\Http\Controllers\ItemController',
    'posts' => 'App\Http\Controllers\PostController',
]);

建立帶api resources方法的控制器

php artisan make:controller PostController --api --model=Post

建立api resources 路由

Route::apiResource(‘posts’,‘App\Http\Controllers\PostController’);

保護控制器裡的Action

class HomeController extends Controller
{
    public function __construct(){
        //此控制器的所有方法都需要有登入才能訪問
        $this->middleware('auth');
        
        //此控制器的store()需要有登入才能訪問
        $this->middleware('auth')->only('store');
        
        //除index()外,此控制器的其他方法需要有登入才能訪問
        $this->middleware('auth')->except('index');
    }

在路由檔內加入中介層保護

//此路由需要登入才能訪問
Route::get('/users/{id}/courses/{course}', 'App\Http\Controllers\HomeController@signup')->middleware('auth');

生成網址

{{ url(路由路徑) }}
{{ route(路由名稱) }}

課後總結

控制器練習作業

⽣成控制器指令 能⽤make指令⽣成控制器類別

把值傳送給視圖後回應 能⽤三種⽅法之⼀來傳送多個值給View

掌握資源控制器 能建⽴Item這個資源的控制器,並⽣成7個 對應Action

參考資料