减少模块之间耦合的最佳方法是什么?
例如,如果我有一个Invoice
包并且它与该包相关Customer
。
我的理解是,我必须使用“挂钩”系统来注入,例如,在客户的编辑视图中插入一个包含客户发票列表的选项卡。
反过来,从“Invoice”包的角度,使用事件系统来了解,例如,何时有人试图删除客户端。
我想要实现的是减少耦合,这样如果我删除发票包,客户端包不受影响。
我怎么才能得到它?使用 Laravel 的事件系统?使用如下所示的自定义类?
我的钩子类:
class HookRepository
{
/**
* The repository items.
*
* @var \Illuminate\Support\Collection
*/
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);
}
}
潇潇雨雨