控制器

控制器

  • 簡單的說,控制器本質(zhì)上是在一個(gè)位置將一個(gè)或多個(gè)路由有邏輯組織在一塊的類??刂破魍鶗?huì)將類似的路由組合在一起,特別是如果應(yīng)用程序是按照傳統(tǒng)CRUD格式構(gòu)造的,在這種情況下,控制器可以處理那些可對特定資源執(zhí)行的所有操作

  • 控制器的主要任務(wù)是捕獲HTTP請求,并將這些請求傳遞給應(yīng)用程序的剩余部分

  • 生成控制器

    php artisan make:controller cname
    

    接下來就會(huì)在app/Http/Controllers中創(chuàng)建一個(gè)名為cname.php的新文件

  • 控制器的命名空間

    為控制器創(chuàng)建一個(gè)路由

    Route::get('/', 'cname@fun');
    

    在上面這個(gè)路由中我引用了一個(gè)具有完全限定類名的控制器APP\Http\Controllers\cname但是只使用了類名cname,這是因?yàn)椋谀J(rèn)情況下,Laravel被設(shè)置為在該命名空間中尋找控制器

  • 通用控制器方法示例

    • 返回視圖

      public function index() {
        return view('fun')->with('variable', Task::all());
      }
      

      該控制器方法會(huì)加載resouces/views/fun.php視圖,并將其通過一個(gè)名為variable的變量進(jìn)行傳遞,其中包含Task::all()Eloquent方法的結(jié)果

    • 獲取用戶輸入

      此方法的作用是從用戶哪里獲取輸入內(nèi)容并對其進(jìn)行操作

      • 首先,快速實(shí)現(xiàn)綁定

        //綁定基本的表單操作
        //route/web.php
        Route::get('tasks/create', 'Taskscontroller@create');
        Route::post('tasks', 'Taskscontroller@store');
        

        綁定tasks/create的GET操作(顯示表單)和tasks/的POST操作(創(chuàng)建一個(gè)新的任務(wù)并進(jìn)行POST操作時(shí)提交到tasks/)。假設(shè)控制器中的create()方法只顯示一個(gè)表單,store()方法的使用如下所示

        //常見的表單輸入控制器方法
        //Taskscontroller.php
        public function store() {
            $task = new Task;
            $task->title = Input::get('discription');
            $task->save();
            
            return redirect('tasks');
        }
        

        該示例使用了Eloquent模型和redirect()函數(shù),創(chuàng)建了一個(gè)新的Task,從用戶輸入中提取數(shù)據(jù)并進(jìn)行保存,然后重定向到顯示所有任務(wù)(task)的頁面。

        從POST中獲取用戶輸入有兩種主要方式:這里使用了Input facade及請求對象(request object)

    • 將依賴注入控制器

      Laravel的facade代表Laravel代碼庫中最有用的類的簡單界面,可以獲取當(dāng)前相關(guān)請求,用戶輸入,會(huì)話和緩存等信息,所有的控制器方法都是由Laravel的容器進(jìn)行解析的,這意味著所有的指定容器都知道如何解析的信息都將被自動(dòng)注入

      如果希望擁有一個(gè)Request對象的實(shí)例而不是用facade實(shí)現(xiàn),只需要在方法參數(shù)中指定Illuminate\Http\Request就行,如下示例

      public function store(\Illuminate\Http\Request $request) {
          $task = new Task;
          $task->title = $request->input('title');
          $task->description = $request->input('description');
          $task->save();
          
          return redirect('tasks');
      }
      
  • 資源控制器

    • Laravel對傳統(tǒng)REST/CRUD控制器的所有路由都有一些約定

      HTTP動(dòng)詞 URL 控制器方法名稱 具體名字 描述
      GET tasks index() tasks.index 顯示所有任務(wù)
      GET tasks/create create() tasks.create 顯示創(chuàng)建任務(wù)表單
      POST tasks store() tasks.store 從創(chuàng)建任務(wù)表單中接受表單提交
      GET tasks/{task} show() tasks.show 顯示一個(gè)任務(wù)
      GET tasks/{task}/edit edit() tasks.edit 編輯一個(gè)任務(wù)
      PUT/PATCH tasks/{task} update() Tasks.update 從編輯任務(wù)表單中接受表單提交
      DELETE tasks/{task} destroy() tasks.destroy 刪除一個(gè)任務(wù)
    • 綁定資源控制器

      • 以上是在Laravel中使用的傳統(tǒng)路由名稱,但我們不必為每一個(gè)控制器方法生成路由,而可以使用一種叫“資源控制器綁定”的方法

        //routes/web.php
        Route::resource('tasks', 'TasksController');
        

        這樣就可以自動(dòng)將該資源上的所有路由綁定到指定控制器的相應(yīng)方法上,他也會(huì)適當(dāng)?shù)孛@些路由,例如,tasks資源控制器上的index()方法將被命名為tasks.index

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容