laravel-commode/viewmodel

laravel 5. 的 ViewModel 方法(=>1)

dev-master 2015-06-16 22:34 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:58:08 UTC


README

#Commode: ViewModel

Build Status Code Climate Test Coverage

laravel-commode/viewmodel 是 laravel 框架中 ViewModel 方法的实现。


####内容

##安装

您可以使用 composer 安装 laravel-commode/viewmodel

"require": {
    "laravel-commode/viewmodel": "dev-master"
}

要启用包,您需要在应用程序配置中注册 LaravelCommode\ViewModel\ViewModelServiceProvider 服务提供者。

  <?php
      // ./yourLaravelApplication/app/config/app.php
      return [
          // ... config code
          'providers' => [
              // ... providers
              'LaravelCommode\ViewModel\ViewModelServiceProvider'
          ]
      ];
##我为什么要费心?

我可以打赌,许多 laravel 用户会问这个问题

"为什么我要关心 ViewModel 方法,既然我已经有 Eloquent 模型和 Input 面具?".

同样,我也打赌这类用户从未使用过仓库/服务/策略模式方法。首先,我想说,Eloquent 不是一个模型。它是以 ActiveRecord 模式实现与数据库通信的绝佳方式。但是,仍然存在每个 eloquent 用户都必须面对的问题,比如封装在 $attributes 数组中的属性。另外,将应用程序输入数据聚合到 ActiveRecord 模型中真的很糟糕,因为当应用程序越来越大时,ActiveRecord 模式中的数据聚合会带来很多痛苦,尤其是如果没有进行抽象,它变得难以阅读、测试和上下文可靠。想象一下,如果你决定转向 Doctrine 的使用,那么重构所有数据聚合/提取/存储将会多么头疼。

因此,结论是,我可以这样说,ViewModel 在用户与数据库交互之间带来了另一个抽象层。

##创建 ViewModel

此包提供了两种基本的 ViewModel 类型:用于仅与文件一起使用的 FileViewModel,以及用于与文件和常见值一起使用的 ViewModel

假设您必须为 Profile 模型实现面向上下文的模型,因为它是面向上下文模型的典型示例:它在您 acl 中使用,在您的管理面板中使用,由您的用户使用,等等... 并且几乎每次它都需要不同的验证器、在存储或拒绝存储在您的数据库之前的不同数据聚合过程等。要创建您的 ViewModel,您需要扩展 LaravelCommode\ViewModel\ViewModels\ViewModel 并实现两个受保护的方法

  • getBaseModel($attributes = array()) - 将接收一个属性关联数组 - ViewModel 的公共属性的当前值。方法必须返回 ViewModel 可以转换到的模型。这可以非常有用,用于转换到其他对象。
  • getValidationObject($data = [], $isNew = true) - 将接收一个属性关联数组 - ViewModel 的公共属性的当前值和一个布尔标志,指示模型是正在创建还是更新。方法必须返回 Laravel 验证器实例。

例如

<?php namespace MyApp\Domain\Admin\ViewModels;

    use LaravelCommode\ViewModel\ViewModels\ViewModel;

    class Profile extends ViewModel
    {
        public $login;
        public $password;
        public $password_confirmation;
        public $email;
        public $firstname;
        public $lastname;

        protected function getBaseModel($attributes = array())
        {
            $model = new \MyApp\DAL\Eloquent\Models\Profile();

            $model->fill($attributes);

            return $model;
        }

        protected function getValidationObject($data = [], $isNew = true)
        {
            $rules = [
                'login'     => 'required',
                'email'     => 'required',
                'firstname' => 'required',
                'lastname'  => 'required'
            ];

            if ($isNew)
            {
                $rules['password'] = 'required|confirmed';
            }

            return \Validator::make($data, $rules);
        }
    }