gpt4 book ai didi

php - 方法重构?

转载 作者:可可西里 更新时间:2023-11-01 13:29:41 24 4
gpt4 key购买 nike

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 个类,例如 DigitalOceanProviderLinodeProviderAwsProvider。例如使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com