我希望(此时轮胎)遵循SOLID原则,但我的想法会崩溃。

我在Laravel中阅读了很多有关 Repository Pattern 的帖子,以遵循SOLID原则。我的问题与this question非常相似。但是我不明白如何才能不违反工厂模式中的打开/关闭主体

我正在开发两因素身份验证系统,并且我有多种方法可以用作tfa。

现在:

  • 身份验证器应用程序
  • 短信

  • 让我们跳到代码:

    Controller :(无工厂)
    public function index(Request $request)
    {
        // Violate the OCP. I'm modyfing the class.
        switch ($request->method) {
            case 'authenticator':
                $tfaMethod = new Authenticator;
                break;
            case 'sms':
                $tfaMethod = new SMS;
                break;
        }
    
        return (new TwoFactorMethod)->process($this->currentUser, $tfaMethod);
    }
    

    TwoFactorMethod类:
    public function process($user, MethodInterface $method)
    {
        return $method->process($user);
    }
    

    每个方法都有自己的类。没关系。但是,如果我想添加一个新方法,例如:电子邮件,我将使用切换用例破坏类中的OCP。

    如何“修复”?还是我这边的误会?

    谢谢!

    最佳答案

    您可以使用TfaMethodRegisty,也许像这样:

    class TfaMethodRegistry
    {
        protected $methods = [];
    
    
        public function register($name, $class)
        {
            $this->methods[$name] = $class;
        }
    
    
        public function get($name)
        {
            return $this->methods[$name];
        }
    }
    

    然后,将其填充到您的AppServiceProvider中,例如:
    public function register()
    {
        $this->app->bind('App\TfaMethodRegistry', function ($app) {
            $registry new TfaMethodRegistry;
    
            $registry->register('sms', new Sms);
            $registry->register('authenticator', new Authenticator);
    
            return $registry;
        });
    }
    

    然后,您可以让Laravel IoC容器注入(inject)您的 Controller 中或任何您需要的地方:
    public function index(Request $request, TfaMethodRegistry $registry)
    {
        $tfaMethod = $registry->get($request->method);
    
        return (new TwoFactorMethod)->process($this->currentUser, $tfaMethod);
    }
    

    因此,基本上,您将可用方法视为配置,但也可以在运行时添加更多方法而无需编辑任何内容。

    提示:不要为此太疯狂,也不要过于虔诚地考虑整个SOLID。通常,KISS比SOLID更好:)

    关于php - Laravel SOLID使用存储库模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46544936/

    10-12 07:18