2015-05-03 210 views
0

我仍然習慣於MVC的概念,但我理解它的基本概念。 我在「PHP」博客上找到了這段代碼。Laravel MVC概念

<?php 
class Todo_Controller extends Base_Controller 
{ 
    public function action_list() { 
     $todos = Todo::all(); 
     return View::make("list") 
       ->with("todos", $todos); 
    } 

    public function action_view($id) { 
     $todo = Todo::where_id($id)->first(); 
     return View::make("view") 
       ->with("todo", $todo); 
    } 

    public function action_delete($id) { 
     $todo = Todo::where_id($id)->first(); 
     $todo->delete(); 
     return View::make("deleted"); 
    } 

    public function action_new() { 
     return View::make("add"); 
    } 

    public function action_add() { 
     $todo = new Todo(); 
     $todo->title = Input::get("title"); 
     $todo->description = Input::get("description"); 
     $todo->save(); 
     return View::make("success"); 
    } 
} 

這是一個控制器,但我注意到action_list(),ACTION_VIEW()和action_delete()正在運行SQL,但它是做什麼的控制器。 這是爲什麼?不應該在模型中?是不是模型做任何與數據有關的目的?

我之所以問這個問題,是因爲我看過很多laravel教程,它們都是付費和無付費的教程,我在問自己,爲什麼混合使用業務邏輯和數據模式?

+1

大多數教程解釋如何做一些功能,如「如何用Laravel保存Todo」。快速和骯髒。上面的代碼的上下文可能是爲了這個目的,而不是教你最佳實踐的軟件開發。 – Smalbil

回答

0

您可以使用存儲庫模式來提取從控制器查詢的數據。

class TodoRepository { 

    public function get_todo($id) 
    { 
     return Todo::find($id); 
    } 

    public function get_all_todos() 
    { 
     return Todo:all(); 
    } 

    public function create_todo($todo) 
    { 
     return Todo::create([ 
      'title' => $todo['title'], 
      'description' => $todo['description'] 
     ]); 
    } 

    public function delete_todo($todo) 
    { 
     return Todo::find($todo)->delete(); 
    } 
} 

然後,您將資源庫注入您的控制器。這樣,如果你改變數據庫,或溝通口才,那麼你只需用相同的界面編寫一個新的倉庫,你只需要更換注入。

class Todo_Controller extends Base_Controller 
{ 
    private $todos; 

    public function __construct(TodoRepository $todos) 
    { 
     $this->todos = $todos; 
    } 

    public function action_list() { 
     return View::make("list") 
       ->with("todos", $this->todos->get_all_todos()); 
    } 

    public function action_view($id) { 
     return View::make("view") 
       ->with("todo", $this->todos->get_todo($id)); 
    } 

    public function action_delete($id) { 
     $this->todos->delete_todo($id); 
     return View::make("deleted"); 
    } 

    public function action_new() { 
     return View::make("add"); 
    } 

    public function action_add() { 
     $todo = $this->todos->create_todo(Input->get('title', 'description'); 
     return View::make("success"); 
    } 
} 

這是你的控制器不關心你如何get_all_todos或delete_todo,它只是要求存儲庫中獲取/修改數據,然後返回結果。