方法重构?

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,LinodeProviderAwsProvider.例如,使用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)

Sau*_*ogi 0

根据我的说法,你应该像这样实现它:

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)

希望你应该做一些代码结构改造。

希望这可以帮助!

  • 这是一种有争议的方法。传递字符串来创建令牌(或任何与此相关的东西)充其量是不明确的。你没有 IDE 自动完成功能,如果我要继承这段代码,我不知道需要传递什么字符串才能实际获取令牌,除了挖掘代码之外,我看不到真正找到答案的方法。 (4认同)