Skip to content

Instantly share code, notes, and snippets.

@pchelk1n
Last active November 23, 2022 08:54
Show Gist options
  • Save pchelk1n/1786823c7a351c5b3f909631ba9f0d8f to your computer and use it in GitHub Desktop.
Save pchelk1n/1786823c7a351c5b3f909631ba9f0d8f to your computer and use it in GitHub Desktop.
PHP Strategy Pattern
.....
"autoload": {
"psr-4": {"App\\": "src/"}
}
<?php
namespace App\YourStrategyResolver\Handlers;
interface Handler
{
public function can(): bool;
public function do(): array;
}
<?php
require __DIR_.'vendor/autoload.php';
use App\YourStrategyResolver\Handlers\YourOneStrategyHandler;
use App\YourStrategyResolver\Handlers\YourTwoStrategyHandler;
use App\YourStrategyResolver\YourStrategyResolver;
$strategyResolver = new YourStrategryResolver();
$strategyResolver->addHandler(new YourOneStrategyHandler());
$strategyResolver->addHandler(new YourTwoStrategyHandler());
// .. add some more handlers
// print ['one data']
var_dump($strategyResolver->resolve());
<?php
namespace App\YourStrategyResolver\Handlers;
class YourOneStrategyHandler implements Handler
{
public function can(): bool
{
// your logic
return true;
}
public function do(): array
{
// your logic
return ['one data'];
}
}
<?php
namespace App\YourStrategyResolver;
use App\YourStrategyResolver\Handlers\Handler;
class YourStrategyResolver
{
/**
* @var Handler[]
*/
private $handlers = [];
public function addHandler(Handler $handler): void
{
$this->handlers[] = $handler;
}
public function resolve(): ?array
{
foreach ($this->handlers as $handler) {
if ($handler->can()) {
return $handler->do();
}
}
return null;
}
}
<?php
namespace App\YourStrategyResolver\Handlers;
class YourTwoStrategyHandler implements Handler
{
public function can(): bool
{
// your logic
return false;
}
public function do(): array
{
// your logic
return ['two data'];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment