You can watch Jeffrey Way's video from Laracon US 2017 with usage example: https://streamacon.com/video/laracon-us-2017/day-2-jeffrey-way (35:00)
Suppose, we want to create Presenter for our User model:
class User extends Model
{
protected $fillable = [
'name',
];
}
class UserPresenter
{
use SimpleDelegator;
protected $user;
public function __construct($user)
{
$this->user = $user;
}
protected function delegatee()
{
return $this->user;
}
public function formattedName()
{
return 'Decorated ' . $this->user->name;
}
}
$decoratedUser = new UserPresenter($user);
$decoratedUser->formattedName() // call to decorator method
$decoratedUser->name // gets original name from User model
Or, we want to add some additional behavior to our class (as in Jeffrey's example):
class NotifyingThread
{
protected $thread;
public function __construct($thread)
{
$this->thread = $thread;
}
public function addReply()
{
$reply = $this->thread->addReply();
Notification::send(
$reply->mentionedUsers(),
new YouWereMentioned($reply)
);
}
}
$thread = new NotifyingThread($thread);
$thread->addReply($data); // default logic + sending notification
You can install the package via composer:
composer require n7olkachev/php-simple-delegator
Next, add SimpleDelegator trait to your Decorator class:
use SimpleDelegator;
$ composer test
Web agency based in Minsk, Belarus
The MIT License (MIT)