挂钩或事件,以减少包之间的耦合



减少模块之间耦合的最佳方法是什么?

例如,如果我有一个Invoice包,并且它与Customer包相关。

我所理解的是,我将不得不使用一个";钩子";例如,在客户的编辑视图中插入一个包含客户发票列表的选项卡。

反过来,使用事件系统从";发票;包,例如,当有人试图删除客户端时。

我想要实现的是减少耦合,这样如果我删除发票包,客户端包就不会受到影响。

我怎样才能拿到它?使用Laravel的事件系统?使用如下所示的自定义类?

我的钩子类:

class HookRepository
{
/**
* The repository items.
*
* @var IlluminateSupportCollection
*/
protected $items;
/**
* Create a new repository instance.
*
* @return void
*/
public function __construct()
{
$this->items = collect();
}
/**
* Dynamically call methods.
*
* @param  string  $method
* @param  array  $arguments
* @return mixed
*/
public function __call(string $method, array $arguments)
{
return $this->items->{$method}(...$arguments);
}
/**
* Register a new hook callback.
*
* @param  string|array  $hook
* @param  callable  $callback
* @param  int  $priority
* @return void
*/
public function register($hook, callable $callback, int $priority = 10): void
{
$this->items->push(compact('hook', 'callback', 'priority'));
}
/**
* Apply the callbacks on the given hook and value.
*
* @param  string  $hook
* @param  array  $arguments
* @return mixed
*/
public function apply(string $hook, ...$arguments)
{
return $this->items->filter(function ($filter) use ($hook) {
return !! array_filter((array) $filter['hook'], function ($item) use ($hook) {
return Str::is($item, $hook);
});
})->sortBy('priority')->reduce(function ($value, $filter) use ($arguments) {
return call_user_func_array($filter['callback'], [$value] + $arguments);
}, $arguments[0] ?? null);
}
}

使用接口和抽象类从SOLID 实现打开/关闭原则

  1. 识别接口。ClassA想要从ClassB那里得到什么
  2. 泛化-当你有一个接口时,你将能够识别大多数需要实现它的类都需要的通用操作

注意:如果您这样做是希望避免重构代码。算了吧。:(这只会让事情变得容易得多,这已经是一个巨大的好处了。

避免使用钩子来实现结构和/或行为模式。

编辑>Package和Hook都不是Laravel或Design Patterns行话的一部分。

这本身应该给你一个提示。

让我玩一个猜谜游戏:

<?php
PackageInterface {
public function enable();
public function disable();
public function isEnabled();
public function getHooks(): HookInterface[];
}
HookInterface {
public function injectView();
// or maybe
public function injectIntoView($view);
}

这完全取决于您的环境,何时加载包并将某些内容注入视图。

例如,当$invoice->wasPaid()或当客户自己启用程序包$customer->enable($package)时,您可以enable()程序包

相关内容

  • 没有找到相关文章

最新更新