我希望(此时轮胎)遵循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/