用于减少包之间耦合的挂钩或事件

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

例如,如果我有一个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);

}

}


凤凰求蛊
浏览 82回答 1
1回答

潇潇雨雨

使用接口和抽象类来实现S&nbsp;O&nbsp;LID的开闭原则识别一个接口。ClassA想从ClassB得到什么概括 - 当您拥有一个接口时,您将能够识别大多数需要实现它的类将需要的常见操作。(不要在这里尝试过多的面向未来,否则很可能会适得其反)注意:如果您这样做是希望避免重构代码。忘了它。:) 这只会使事情变得更加容易,这已经是一个巨大的好处。避免使用钩子来实现结构和/或行为模式。编辑> Package 和 Hook 都不是 Laravel 或设计模式术语的一部分。这本身应该给你一个提示。让我来玩一个猜谜游戏:&nbsp; &nbsp; <?php&nbsp; &nbsp; PackageInterface {&nbsp; &nbsp; &nbsp; &nbsp; public function enable();&nbsp; &nbsp; &nbsp; &nbsp; public function disable();&nbsp; &nbsp; &nbsp; &nbsp; public function isEnabled();&nbsp; &nbsp; &nbsp; &nbsp; public function getHooks(): HookInterface[];&nbsp; &nbsp; }&nbsp; &nbsp; HookInterface {&nbsp; &nbsp; &nbsp; &nbsp; public function injectView();&nbsp; &nbsp; &nbsp; &nbsp; // or maybe&nbsp; &nbsp; &nbsp; &nbsp; public function injectIntoView($view);&nbsp; &nbsp; }这完全取决于您何时加载包并将某些内容注入视图中。例如,您可以在客户自己启用该包时使用该enable()包$invoice->wasPaid()$customer->enable($package)
打开App,查看更多内容
随时随地看视频慕课网APP