2013-07-27 38 views
9

我一直在寻找Laravel一段时间,我决定终于捡起它。这是我第一次使用MVC框架,并且在模拟这些模型的目的时遇到了一些麻烦。Laravel 4模型,如何使用它们

我已经读了很多新手指南,这是几乎所有这些都是在他们的模型(Laravel明智),

class Model extends Eloquent { 

} 

然后在他们的控制,他们做这样的事情,

$model = new Model; 
$model->text = "text"; 
$model->save(); 

我不是MVC模式的专家(可能是那里最大的新手),但我认为整个问题(或者至少一个小问题)是要分离很多操作。而且该模型应该负责处理所有DB方面的事情。所以在某种程度上,这对我来说似乎是错误的,或者至少不是最佳实践。

但是,如果你开始设置一堆功能,你可能会遇到每个表有一个模型的问题。这再次,似乎不正确。所以你必须以一种模糊的方式制作模型。从某种意义上说,它可以对任何表格采取任何行动?

这一切似乎真的让我感到困惑。

回答

14

您将需要evey表的模型,因为还有其他与不能共享的模型有关的东西,比如列名和验证,但是如果您认为自己在重复,则可以创建一个BaseModel并添加所有方法,甚至超负荷雄辩方法是:

class BaseModel extends Eloquent { 

    public function whatever() { 

    } 

    public function save(array $options = []) { 
     // do what you need to do 
     parent::save(); 
    } 

} 

然后创建你的模型中使用它:

class Order extends BaseModel { 

} 

但你并不需要太多的一个模型,如果你的模式和表名如下Laravel模式(在这种情况下,表名将是'订单s'),那么你只需要这个简单的声明就可以为你的表工作。

编辑:

控制器是为了将数据从一个模型视图转移,但是他们不应该知道太多关于你的数据,几乎所有关于他们应该在于你的模型(“脂肪模型,瘦控制器“),所以他们只需要知道”控制“就足够了。

class OrdersController extends BaseController { 

    public function process() 
    { 
     $order = Order::find(Input::get('orderId'))->process(); 

     return View::make('orders.showProcessedOrder')->with('order',$order); 
    } 

} 
+0

很好的回答!并且详细阐述一下我最初的意思,如果我想抓住一行id为1的模型,我可以做Model :: find(1);在我的控制器中,但是最佳实践(松散地使用该术语)将该“查找”放置在函数中并将结果返回给控制器,而不是在控制器中实际执行该操作?在这种情况下,它可能不会,但如果想更大的事情。 – Andreas

+0

刚刚编辑了一些答案。 –

+0

但你确实是对的。他们忘记了数据源和适配器。这就是为什么你可能会认为像验证和关系这样的事情必须为每个数据库重写一百万次。不对。完全一样。 ......这个魔法必杀技甚至可能与Laravel一起,但你必须自己将所有这些连接起来。这值得么?或者你会订阅混乱吗?由你决定,但我认为你原来的问题很好。无论你认为自己是否是新手,你都在考虑良好的设计实践。 – Tom

-1

模型是数据库表(这是您的应用程序的真实世界的东西)的包装。它们为您提供了一个用于存储数据的基于代码的OO界面,您可以将数据特定的逻辑放入模型中。 OOP都是关于类和对象的,并将诸如传入的HTTP请求和数据存储之类的东西转换成这种形式。

你的问题是一个很好的问题。在学习如何制作Web应用程序时,拥有一个三层Web应用程序 - 一个表示层,一个业务逻辑层和一个数据存储层,数据存储在关系数据库中 - 效果很好,而且添加它并不意味着什么代码中的额外一层与数据库相关的东西。和Antonio写的MVC编程一样,“胖模型,瘦身控制器”就是你正在努力的方向。理想情况下,控制器应该只是几行代码,将传入的请求传递给可以验证的正确模型,添加到数据库等等。(但是,最简单的方法是在您首次将控制器放入控制器时学习/计算MVC。)