iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
2
Modern Web

如何用Laravel寫一個簡單的部落格網站系列 第 14

[Day 14] Laravel的路由(Route)與控制器(Controller)(二)

  • 分享至 

  • xImage
  •  

控制器(Controller)

當我們在routes/web.php寫好路由(Route),
輸入網址之後,
路由就會去找要交給哪個控制器來處理.

譬如昨天我們寫的

Route::get('/user/auth/sign-up', 'UserAuthController@signUpPage');

當我們輸入 網址/user/auth/sign-up 的時候,
路由就會找到UserAuthController底下的signUpPage方法來處理,
然後做相應的動作,
控制器可以回傳View畫面,
也可以回傳Json字串等,
我們也可以在方法中加入編號,
這個我們在之後有用到的時候會再說明.

所有的控制器都放在app/Http/Controller目錄中
https://ithelp.ithome.com.tw/upload/images/20200926/20105694YwtL0sgjBB.png

預設會有一個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,
否則無法正確使用.
https://ithelp.ithome.com.tw/upload/images/20200926/20105694qrr8acg8Zy.png

我們把剛剛的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上的設定.
https://ithelp.ithome.com.tw/upload/images/20200926/20105694jGvphgDp0s.png

我是直接拿Laravel預設畫面來用,
表示我們已經成功呼叫模板了.


上一篇
[Day 13] Laravel的路由(Route)與控制器(Controller)(一)
下一篇
[Day 15] 處理Laravel-Mix的錯誤
系列文
如何用Laravel寫一個簡單的部落格網站25
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
khll1l7
iT邦新手 5 級 ‧ 2022-11-02 18:00:50

我按照您的步驟設好了路由,但不知道怎麼像你開頭說的輸入網址~
還有controllers目錄底下也沒有出現HomeController和UserAuthController兩個檔案
不知道是哪邊錯掉了!
謝謝大師解答

我也是跟著前面的步驟做到這邊,針對你的問題

  1. 怎麼像你開頭說的輸入網址

以文章中的網址/user/auth/sign-up為例,如果是跟前面的步驟,這邊"網址"要輸入的是 localhost:8000,也就是說完整的網址是localhost:8000/user/auth/sign-up

  1. controllers目錄底下也沒有出現HomeController和UserAuthController兩個檔案

其實文章中有說明

預設會有一個Controller.php的檔案,
其他的Controller都是我們自己加上的...

只是作者並沒有說明如何增加一個 controlller,增加 controlller 的指令如下 (以 HomeController 為例)

php artisan make:controller HomeController

希望有幫助到你!

0
leochang658
iT邦新手 5 級 ‧ 2023-12-21 08:53:52

如果遇到 Target class [HomeController] does not exist 的問題,有 2 個解法

  1. 在 web.php 把 Route::get('/', 'HomeController@indexPage');改成Route::get("/", "App\Http\Controllers\HomeController@indexPage");
  2. 在 RouteServiceProvider.php 中,
    Route::middleware('web)後面加上->namespace("App\Http\Controllers")

這個方法可以!!!

在 web.php 把 Route::get('/', 'HomeController@indexPage');改成Route::get("/", "App\Http\Controllers\HomeController@indexPage");

小魚 iT邦大師 1 級 ‧ 2024-01-14 07:23:17 檢舉

eric19740521
新版本我都是這樣用,

use App\Http\Controllers\HomeController;
Route::get('/', [HomeController::class, 'index']);

其實印象中改一個地方就可以用原本的方法,
在我單元測試那一系列文章裏面有寫.

我要留言

立即登入留言