Slide 1

Slide 1 text

Implementing deep and eloquent models with Laravel 5.4 Laravel/Vue ษڧձ #1 nunulk

Slide 2

Slide 2 text

Who am I? $I->am(‘nunulk’) ->workAs(‘freelance programmer’) ->tackleComplexityOfSoftware()
 ->with([
 ‘Domain-Driven Design’,
 ‘Laravel’
 ]);

Slide 3

Slide 3 text

deep model “A deep model provides a lucid expression of the primary concerns of the domain experts and their most relevant knowledge while it sloughs of the superficial aspects of the domain.”
 - Domain-Driven Design

Slide 4

Slide 4 text

eloquent “expressing what you mean using clear and effective language”
 - Macmillan dictionary

Slide 5

Slide 5 text

Domain User
 in users table

Slide 6

Slide 6 text

Model inherits Eloquent\Model class User extends Model
 {
 } // retrieving a model
 $user = User::find($id);
 // accessors & mutators
 $user->email


Slide 7

Slide 7 text

Domain Guest
 in users table Host
 in
 users table Pair

Slide 8

Slide 8 text

Model inherits Eloquent\Model class Guest extends Model
 {
 protected $table = ‘users’;
 protected static function boot()
 {
 parent::boot();
 static::addGlobalScope(‘guest’, function (Builder $builder) {
 // restrictions here
 });
 }
 } // retrieving a model
 $guest = Guest::find($id);
 // accessors & mutators
 $guest->email


Slide 9

Slide 9 text

Model has Eloquent\Model class Guest
 {
 protected $user;
 public function __construct(User $user)
 {
 $this->user = $user;
 }
 public function __get($key)
 {
 return $this->user->$key;
 }
 } // retrieving a model
 $guest = new Guest(User::find($id));
 // accessors & mutators
 $guest->email


Slide 10

Slide 10 text

Model as ValueObject class ElapsedTime
 {
 public function __toString()
 {
 $diff = $this->from->diff($this->to);
 if ($diff->d > 0) {
 return $diff->d . ‘೔લ’;
 }
 […]
 }
 }
 class User extends Model
 {
 public function getLastLoggedInAtAttribute($value)
 {
 return new ElapsedTime($value, Carbon::now()); // N೔લ, N࣌ؒલ, N෼લ, ͨͬͨࠓ
 }
 } // accessors & mutators
 $user->last_logged_in_at // instance of ElapsedTime

Slide 11

Slide 11 text

Model as Enum class UserRole extends Enum
 {
 const HOST = 1;
 const GUEST = 2;
 static private $list = [
 self::HOST => ‘ϗετ’,
 self::GUEST => ‘ήετ’
 ];
 }
 class User extends Model
 {
 public function getRoleAttribute($value)
 {
 return new UserRole($value);
 }
 } // accessors & mutators
 $user->role // instance of UserRole

Slide 12

Slide 12 text

Application Laravel Vue Data

Slide 13

Slide 13 text

Model as ViewModel with Fluent abstract class ViewModel extends Fluent
 {
 abstract public function render();
 }
 class ConcreteViewModel extends ViewModel
 {
 public function render()
 {
 return […]
 }
 } $vm = new ConcreteViewModel([‘foo’ => $foo]);
 $vm->foo // attribute

Slide 14

Slide 14 text

Model as ViewModel class UserView extends ViewModel
 {
 public function render()
 {
 $additionals = [‘full_name’];
 return $this->user->append($additionals);
 }
 }
 class User extends Model
 {
 public function getFullNameAttribute()
 {
 return $this->family_name . ’ ’ . $this->given_name;
 }
 } // like DTO
 return (new UserView([‘user’ => $user]))->render();

Slide 15

Slide 15 text

Model as ViewModel 

{{ user.full_name }}

 
 
 export default {
 data () {
 return {
 user: {},
 }
 },
 created () {
 window.axios.get(‘/api/user’)[…]
 }
 }


Slide 16

Slide 16 text

deep and eloquent model •Eloquent\Model •ValueObject •Enum •ViewModel (Fluent) •Vue.js and more…