在 TokenRepository
中,您可以看到 3 个类似的方法。它为 token 表创建新条目,但每种方法都有不同的字段。
我该如何重构它?我应该将 3 种方法合并为 1 种方法还是应该使用策略模式?
TokenRepository 类:
class TokenRepository
{
public function createTokenDigitalOcean(User $user, $name, $accessToken, $refreshToken = null)
{
return $user->tokens()->create([
'name' => $name,
'provider' => 'digital_ocean',
'access_token' => $accessToken,
'refresh_token' => $refreshToken,
]);
}
public function createTokenLinode(User $user, $name, $key)
{
return $user->tokens()->create([
'name' => $name,
'provider' => 'linode',
'linode_key' => $key,
]);
}
public function createTokenAws(User $user, $name, $key, $secret)
{
return $user->tokens()->create([
'name' => $name,
'provider' => 'aws',
'aws_key' => $key,
'aws_secret' => $secret,
]);
}
}
我有 3 个类,例如 DigitalOceanProvider
、LinodeProvider
和 AwsProvider
。例如使用 LinodeProvider
和 AwsProvider 类。
class LinodeProvider
{
public function callback()
{
$this->tokenRepo->createTokenLinode($user, $name, $key);
}
}
class AwsProvider
{
public function callback()
{
$this->tokenRepo->createTokenAws($user, $name, $key, $secret);
}
}
最佳答案
这可能有点矫枉过正,但为了让以后的生活更轻松一些,您可以为每个扩展抽象类的对象创建单独的实现。这样您就可以统一和定义接口(interface)并轻松添加新的 token 类型。
<?php namespace Foo\Tokens;
abstract class Token
{
protected $name = '';
protected $key = '';
protected $provider = '';
public function __construct($name, $key)
{
$this->name = $name;
$this->key = $key;
}
public function data()
{
return [
'name' => $this->name,
'provider' => $this->provider,
'token' => $this->key
];
}
}
接下来,我们创建我们的 Digital Ocean token 类。此类可以使用默认实现或重新定义它。
<?php namespace Foo\Tokens;
use Foo\Tokens\Token;
class DigitalOceanToken extends Token
{
protected $provider = 'digital_ocean';
public function __construct($name, $key, $refreshToken = null)
{
parent::__construct($name, $key);
$this->refreshToken = $refreshToken;
}
public function data()
{
return [
'name' => $this->name,
'provider' => $this->provider,
'key' => $this->key,
'refreshToken' => $this->refreshToken
];
}
}
TokenRepository 现在只关心将给定的 token 附加到用户。
<?php namespace Foo;
use User;
use Foo\Tokens\Token;
class TokenRepository
{
public function createToken(User $user, Token $token)
{
return $user->tokens()->create(
$token->data()
);
}
}
而您的服务提供商就像...一样简单
<?php
use Foo\Tokens\AwsToken;
class AwsProvider
{
public function callback()
{
$this->tokenRepo->createToken(
$user, new AwsToken($name, $key, $secret)
);
}
}
这不是工作代码,因为我没有尝试运行它,但这只是您如何组织和分配责任的另一种想法。希望对您有所帮助,并欢迎其他人提供反馈。
关于php - 方法重构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40869452/