一般在 route 中如果會有資料處理的程式邏輯,我們並不會寫在 route 中,一來這本來就不是 route 本身的職責,二來是整個 route 會混雜多個任務,造成日後維護的困難。Controller 是專門用來處理程式邏輯的單元,Route 只要知道將任務轉交給哪個 Controller 處理即可。
首先,在 app/controllers 目錄下新增一個 HomeController.php。在這個目錄下會有一個 Controller 的基礎類別 BaseController.php ,我們建立的 HomeController.php 就要繼承這個類別,程式碼如下:<?php
class HomeController extends BaseController {
public function index()
{
return View::make('home')
->with('title', '首頁')
->with('hello', '大家好~~');
}
}
在這個類別中,我們建立了一個 index() 方法,並把原本在 route 中的內容移動到這裡。現在由 HomeController 來回傳 view。接著修改原本的 route :
Route::get('/', 'HomeController@index');
原本的 route 變成只有一行了,非常簡潔。第二個參數從原本的 function 換成 Controller 的名稱 @ 方法名稱。現在的整個流程是:Route -> Controller -> View
這裡另外介紹一個 Controller 常用的功能。有時候我們會以 id 去查詢資料庫中的資料然後顯示。因為我們還沒有說明資料庫的部份,所以只介紹顯示使用者輸入的 id。
1.首先在原本的 route 下新增一行新的 route:
Route::get('post/{id}', 'HomeController@show');
2.在 HomeController 中新增相對應的方法 show():
public function show($id)
{
return View::make('home')
->with('title', '首頁')
->with('hello', '大家好~~'.$id);
}
注意到和 index() 不同的地方,show() 有一個傳入參數 $id,我們簡單的把它串接在 hello 字串後面顯示。現在在網址中輸入
http://localhost:8000/post/123
就會顯示大家好~~123記得網址最後面不能有斜線。後面接的 123 就是變數 $id 的值,輸入任何值,controller 就會收到這個值,這時候就可以去資料庫中查詢,這個範例只是單純顯示它。
本文網址:https://blog.tonycube.com/2014/12/laravel-7-controller.html
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
請問出現以下這個錯誤訊息是什麼原因? 謝謝
回覆刪除FatalErrorException in HomeController.php line 3:
Class 'BaseController' not found
你的 BaseController.php 有在同一個目錄裡嗎?它找不到
刪除5.2好像有做變更!路徑變成App\Http\Controllers
刪除裡面是Controller.php!
HomeController.php最上頭還要加一段
namespace App\Http\Controllers;
才能繼承Controller
class HomeController extends Controller
不然會找不到
感謝你的說明 :)
刪除5.2好像有做變更!路徑變成App\Http\Controllers
刪除裡面是Controller.php!
HomeController.php最上頭還要加一段
namespace App\Http\Controllers;
才能繼承Controller
class HomeController extends Controller
不然會找不到
作者已經移除這則留言。
回覆刪除您好
回覆刪除我使用5.3
我照著樓上5.2的方法打
卻出現這句
Class 'App\Http\Controllers\View' not foundnnn
確認你的 controller 檔案和 Controller.php 在同一個目錄,
刪除並且有 use App\Http\Controllers\Controller;
參考文件:https://laravel.tw/docs/5.2/controllers
你好 我出現同樣問題 但不知改哪
刪除FatalErrorException in HomeController.php line 3:
Class 'App\Http\Controllers\BaseController' not found
我假設你是用 5.3 版,
刪除那 app/Http/Controllers 目錄下應該有 Controller.php
如果有的話,繼承它,就會像這樣
====================================
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class xxxController extends Controller
{
//...
}
====================================
xxxController 是你自訂的名稱。
namespace App\Http\Controllers;
刪除use View;----我是加這行就成功了
作者已經移除這則留言。
回覆刪除作者已經移除這則留言。
刪除我是5.4.15的LARAVEL 以下是可以執行的內容
回覆刪除==================
<?php
namespace App\Http\Controllers;
use View;
class HomeController extends Controller {
public function index()
{
return View::make('test')
->with('title', '首頁')
->with('hello', '大家好~~');
}
}
====================
執行完卻跑出Namespace declaration statement has to be the very first statement or after any declare call in the script,但我的確有把namespace放在第一行,還有哪邊可能會出問題呢?感謝賜教!
回覆刪除確認檔案的第一行是 <?php 開頭,並且前面沒有任何空白。
刪除確認有在命令列執行 composer dump-autoload,當你有新增 controller 時,最好都執行一次。
作者已經移除這則留言。
刪除作者已經移除這則留言。
刪除我的網頁無法正常顯示,但將此兩行程式的中文變數值更改為英文便可以正常顯示出,請問版主此狀況如何修正,感謝!!
回覆刪除->with('title', '首頁')
->with('hello', '大家好~~');
在 .env 檔中加入
刪除APP_LOCALE=zh-Hant-TW
APP_FALLBACK_LOCALE=zh-Hant-TW
還有網頁(*.html)的檔頭必須是
<!DOCTYPE html>
<html lang="zh-Hant-TW">
另外要檢查一下你的檔案是否儲存為 Unicode 格式,
刪除例如這張圖片 http://svc.luckstar.com.tw/ShareAll/KM/How/Windows/20170917-graph/NotepadSaveAs.jpg
laravel 8
回覆刪除請使用
Route::get('/', 'App\Http\Controllers\HomeController@index');
或是將路徑下此檔\app\Providers\RouteServiceProvider.php
加入一行
protected $namespace = 'App\Http\Controllers';
於class
即可使用
Route::get('/', 'HomeController@index');
不然會呼叫不到自訂的class name