模型和类库

目录

模型

模型是应用程序的心脏. 你的应用程序逻辑 (控制器 / 路由)和视图(html)只是你的模型与用户互动的媒介. 模型中最典型的逻辑是Business Logic.

一个模型的一些功能示例,如下:

  • 数据库交互
  • 文件 I/O
  • 网络服务交互

例如,也许你正在开发一个博客,你可能会希望有一个"发布博文"的模式.用户可能要评论博文,所以你也有一个"评论"模型.如果用户要进行评论,那么我们还需要一个"用户"模型.有想法了吗?

类库

类库是用来执行操作的并不内置于应用程序的一些类. 例如,一个从HTML生成PDF的转换类库. 这个任务,虽然复杂,但不是每个应用程序必须的,因此,它被认为是一个"类库".

创建一个类库,和创建一个类并把它存储在库文件夹中一样方便.在下面的例子中,我们将创建一个带有简单的方法类库,只用来输出传给它的参数.我们用下面的代码在libraries文件夹中创建printer.php文件.

<?php

class Printer {

    public static function write($text) {
        echo $text;
    }
}

你可以在你工程的任何地方以这种方式调用: Printer::write('this text is being echod from the write method!').

自动加载

依赖于Laravel的自动加载功能类库和模型可以方便的被使用.更多相关的文档,请参阅自动加载.

最佳实践

我们通常这样告诫自己: "控制器越轻量级越好!" 但是我们怎么真正的实现它呢? 可能部分问题是"model"这个词引起的. 他真正意味着什么? 他是真正的期限吗? 很多模型和数据库关联, 这导致有很臃肿的控制器和很轻量级的模型来访问数据库.让我们来探讨一些替代品.

如果我们完全废弃"models"目录会怎样? 让我们给他一个更有用的命名.事实让我们把它和工程的名称取的相同.假设我们有一个卫星追踪网站名为"trackler",让我们在application文件夹下建立一个叫"trackler"的目录.

太棒了!接下来,让我们把我们的类分成"实体-entities","服务-services","资料库-repositories".让我们在"trackler"文件夹下建立三个对应的文件夹:

实体(Entities)

把entities想成你工程的数据容器. 它们主要只包含属性. 所以,在我们的程序中, 我们需要一个"Location"实体包含"latitude(纬度)"和"longitude(经度)"属性.可以这样做:

<?php namespace Trackler\Entities;

class Location {

    public $latitude;
    public $longitude;

    public function __construct($latitude, $longitude)
    {
        $this->latitude = $latitude;
        $this->longitude = $longitude;
    }

}

好,现在你拥有一个实体了, 让我们处理另外两个文件夹.

服务(Services)

服务包含应用程序的处理流程(processes).继续以Trackler为例,我们的程序也许要包含一个用来提交CPS位置的表单,我们需要验证,坐标信息是被正确格式化的.我们需要验证(validate)location实体,所以我们在"services"文件夹下建立"validators"文件夹,加入一个验证类:

<?php namespace Trackler\Services\Validators;

use Trackler\Entities\Location;

class Location_Validator {

    public static function validate(Location $location)
    {
        // Validate the location instance...
    }

}

太棒了!现在我们在的控制器和路由隔离的情况下有一个伟大的方式来测试我们的验证!location验证成功了,我们需要保存它,接下来:

资料库(Repositories)

资料库是应用程序的数据访问层. 他们是负责存储和检索您的应用程序实体(entities), 继续以location为例,我们需要一个可以存储location的库. 我们可以使用我们希望的任何机制来存储, 关系型数据库, Redis, 或者未来的什么先进的存储方式. 让我们看下例子:

<?php namespace Trackler\Repositories;

use Trackler\Entities\Location;

class Location_Repository {

    public function save(Location $location, $user_id)
    {
        // Store the location for the given user ID...
    }

}

现在我们在"实体-entities","服务-services","资料库-repositories"之间有一个干净的分离. 这意味着我们在我们的服务或控制器中注入基本资料库, 并且将他们从数据库中隔离并测试我们的应用程序的碎片. 同时, 完全可以切换我们的数据存储技术,而不会影响服务, 实体, 或者 控制器. 我们做到了很好的 separation of concerns(关注点分离).

更多相关: