控制器(Controller)
當我們在routes/web.php寫好路由(Route),
輸入網址之後,
路由就會去找要交給哪個控制器來處理.
譬如昨天我們寫的
Route::get('/user/auth/sign-up', 'UserAuthController@signUpPage');
當我們輸入 網址/user/auth/sign-up
的時候,
路由就會找到UserAuthController底下的signUpPage方法來處理,
然後做相應的動作,
控制器可以回傳View畫面,
也可以回傳Json字串等,
我們也可以在方法中加入編號,
這個我們在之後有用到的時候會再說明.
所有的控制器都放在app/Http/Controller目錄中
預設會有一個Controller.php的檔案,
其他的Controller都是我們自己加上的,
如果專案比較小可以把所有的Controller放在app/Http/Controller/這一個目錄底下,
但是如果專案比較大,
常常就需要分好幾個資料夾來放我們的控制器(Controller),
至於要怎麼分,
每個人有每個人的習慣,
沒有一定的規範,
當然有時候公司內部為了方便管理會有公司內部的規定,
這時候我們就按照公司內部的規定來執行就好了.
我們現在把HomeController.php改成這樣:
<?PHP
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class HomeController extends Controller
{
//首頁
public function indexPage()
{
//省略
}
}
?>
可以看到最前面有一行 namespace App\Http\Controllers;
,
這個是命名空間的宣告,
根據Laravel的規範需要用目錄來命名,
當我們需要使用到其他檔案的時候,
就需要連同命名空間一起呼叫,
譬如 use App\Http\Controllers\Controller;
,
我們就可以使用App\Http\Controllers\Controller.php的功能
模板(views)
Laravel方便的地方就是使用模板,
所有的模板都放在resources/views目錄底下,
名稱必須命名為*.blade.php,
否則無法正確使用.
我們把剛剛的App/Http/Controllers/HomeController.php修改如下:
<?PHP
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class HomeController extends Controller
{
//首頁
public function indexPage()
{
return view('welcome');
}
}
?>
當我們輸入首頁的網址的時候就會去讀resources/views/welcome.blade.php這個檔案,
現在我們輸入 http://localhost:8915/ 就會看到以下內容,
在這裡輸入的Port號是要根據我們在Server上的設定.
我是直接拿Laravel預設畫面來用,
表示我們已經成功呼叫模板了.
我按照您的步驟設好了路由,但不知道怎麼像你開頭說的輸入網址~
還有controllers目錄底下也沒有出現HomeController和UserAuthController兩個檔案
不知道是哪邊錯掉了!
謝謝大師解答
我也是跟著前面的步驟做到這邊,針對你的問題
以文章中的網址/user/auth/sign-up
為例,如果是跟前面的步驟,這邊"網址"要輸入的是 localhost:8000
,也就是說完整的網址是localhost:8000/user/auth/sign-up
其實文章中有說明
預設會有一個Controller.php的檔案,
其他的Controller都是我們自己加上的...
只是作者並沒有說明如何增加一個 controlller,增加 controlller 的指令如下 (以 HomeController 為例)
php artisan make:controller HomeController
希望有幫助到你!
如果遇到 Target class [HomeController] does not exist 的問題,有 2 個解法
Route::get('/', 'HomeController@indexPage');
改成Route::get("/", "App\Http\Controllers\HomeController@indexPage");
Route::middleware('web)
後面加上->namespace("App\Http\Controllers")
這個方法可以!!!
在 web.php 把 Route::get('/', 'HomeController@indexPage');改成Route::get("/", "App\Http\Controllers\HomeController@indexPage");
eric19740521
新版本我都是這樣用,
use App\Http\Controllers\HomeController;
Route::get('/', [HomeController::class, 'index']);
其實印象中改一個地方就可以用原本的方法,
在我單元測試那一系列文章裏面有寫.