2015-05-03 213 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,它只是要求存储库中获取/修改数据,然后返回结果。