I'l*_*ack 6 php strategy-pattern repository-pattern laravel laravel-5
在TokenRepository你可以看到3种类似的方法.它创建了令牌表的新条目,但每个方法都有不同的字段.
我怎么能重构这个?我应该将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,
]);
}
}
Run Code Online (Sandbox Code Playgroud)
我有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);
}
}
Run Code Online (Sandbox Code Playgroud)
根据我的说法,你应该像这样实现它:
class TokenRepository
{
public function createTokenForVendor(User $user, $inputs)
{
return $user->tokens()->create($inputs);
}
}
Run Code Online (Sandbox Code Playgroud)
并在你的回调中:
class VendorProvider
{
public function callback()
{
switch($tokenType) {
case 'DigitalOcean':
$inputs = [
'name' => $name,
'provider' => 'digital_ocean',
'access_token' => $accessToken,
'refresh_token' => $refreshToken,
];
break;
case 'Linode':
$inputs = [
'name' => $name,
'provider' => 'linode',
'linode_key' => $key,
];
break;
case 'Aws':
$inputs = [
'name' => $name,
'provider' => 'aws',
'aws_key' => $key,
'aws_secret' => $secret,
];
break;
}
$this->tokenRepo->createTokenForVendor($user, $inputs);
}
}
Run Code Online (Sandbox Code Playgroud)
希望你应该做一些代码结构改造。
希望这可以帮助!