php - 方法重构?

标签 php laravel laravel-5 repository-pattern strategy-pattern

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/

相关文章:

php - Google App Script 将电子邮件从 gmail 获取到第三方应用程序

php - MySql 特定字符之前的 WHERE LIKE?

javascript - 如何在 Laravel 中拆分或分离序列化表单数据

php - 使用 php 和 .htaccess 进行友好的 url 重写。相对链接到 css 图像和 js 的困难

php - 如何修复错误转换的文本(案例 : á é í ó ú ñ)

javascript - 如何在 Laravel 中使表格动态地将第 1 列和第 2 列相乘并在第 3 列中给出答案

laravel - laravel无法更新数据库并获得错误MethodNotAllowedHttpException

php - Laravel:如何在没有数据库的情况下对用户进行身份验证

laravel - 如何在 Vue 中使用 Laravel 辅助函数?

php - Laravel 5.5 将变量传递给子 Controller 返回总是 null?