为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
凤凰求蛊 2024-01-19 15:44:57
减少模块之间耦合的最佳方法是什么?例如,如果我有一个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);}}
查看完整描述

1 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

使用接口和抽象类来实现S O LID的开闭原则

  1. 识别一个接口。ClassA想从ClassB得到什么

  2. 概括 - 当您拥有一个接口时,您将能够识别大多数需要实现它的类将需要的常见操作。(不要在这里尝试过多的面向未来,否则很可能会适得其反)

注意:如果您这样做是希望避免重构代码。忘了它。:) 这只会使事情变得更加容易,这已经是一个巨大的好处。

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

编辑> Package 和 Hook 都不是 Laravel 或设计模式术语的一部分。

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

让我来玩一个猜谜游戏:

    <?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);

    }


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


例如,您可以在客户自己启用该包时使用该enable()包$invoice->wasPaid()$customer->enable($package)


查看完整回答
反对 回复 2024-01-19
  • 1 回答
  • 0 关注
  • 81 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信