關於Controllers
都存放於app\Http\Controllers
可建⽴⼦資料夾
⽤於協同管理Model.View
建⽴Controller的指令
php artisan make:controller Controller名稱
負責定義網⾴請求路由的⼯作
格式:Route::get(‘contact’, ‘App\Http\Controllers\WelcomeController@contact’);
//請求⽅法 偵聽URL路徑 負責的Controller 接⼿的⽅法
• 可使⽤.來對應到⼦資料夾 • 規則判定由上⾄下逐⼀比對,只要符合路徑就傳遞給控制器 • 8.x版本的控制器因前綴預設為空,所以需要補上命名空間
App\Http\Controllers?
因為RouteServiceProvider.php設定了此命 名空間,但8.x開始預設為null
建⽴⼀個不帶⽅法的Controller
php artisan make:controller Controller名稱
負責畫⾯的呈現描述,位於resources/views
public function about(){
return view('about');
}
如想將視圖檔⽤⼦資料夾分類,可使⽤.語法
public function about(){
return view(‘pages.about’);
//回傳pages⼦資料夾的about.blade.php
}
• 內容包含html與Blade標籤 • 檔名中⼀定包含blade • 例如:game.blade.php
• 新增變數並賦值 • 傳送語法以下三種 • 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);
}
}
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"));
}
• 接收語法以下兩種
• {{ $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'
]);
動詞 | 路徑 | 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'
]);
加入中介層
//控制器可在建構⼦宣告哪些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');
//加⼊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');
php artisan make:controller ItemController --resource --model=Item
–resource 表示希望順便生成7個CRUD方法
–model 表示希望順便加入載入Model的程式碼,可自己加
//建立單一表格resource
Route::resource('items','App\Http\Controllers\ItemController');
第一參數為路徑前綴,通常與關連表格名稱相同 第二參數為所接手的控制器名稱
/建立多個表格的resource
Route::resources([
'items' => 'App\Http\Controllers\ItemController',
'posts' => 'App\Http\Controllers\PostController',
]);
php artisan make:controller PostController --api --model=Post
Route::apiResource(‘posts’,‘App\Http\Controllers\PostController’);
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