Fabricante é uma excelente ferramenta de revisão de código usada pelo Facebook e por outras organizações respeitadas de engenharia de software. A interface do usuário é bonita, o fluxo de trabalho e as ferramentas são concisos e abrangentes, e é um utilitário que abrange a maioria dos casos de uso, tanto na Web quanto na linha de comando. Escrevi muitas extensões do Phabricator e descobri que criar uma única extensão de configuração para ser usada por outras extensões é de grande utilidade. Vamos ver como é fácil criar sua própria configuração personalizada para ser usada em todas as suas extensões!


Criando a extensão de configuração


Comece criando uma nova classe que estende a PhabricatorApplicationConfigOptions:



final class PhabricatorBugzillaConfigOptions
  extends PhabricatorApplicationConfigOptions {

  // ....
  
}


Preencha alguns métodos padrão:



public function getName() {
  return pht('Bugzilla');
}

public function getDescription() {
  return pht('Configure Bugzilla Settings.');
}

public function getIcon() {
  return 'fa-cog';
}

public function getGroup() {
  return 'apps';
}


O getOptions é onde as configurações individuais são definidas; vamos criar algumas configurações de exemplo:



public function getOptions() {
  return array(
    $this->newOption(
      'bugzilla.url',
      'string',
      'https://bugzilla.mozilla.org')
      ->setDescription(pht('Full URL for the Bugzilla server.')),
    $this->newOption(
      'bugzilla.automation_user',
      'string',
      'phab-bot@bmo.tld')
      ->setDescription(pht('Automation Username on Bugzilla.')),
    $this->newOption(
      'bugzilla.timeout',
      'int',
      15)
      ->setDescription(pht('Bugzilla timeout in seconds.')),
    $this->newOption(
      'bugzilla.require_bugs',
      'bool',
      false)
      ->setDescription(pht('Require existing Bugzilla bug numbers for revisions.')),
  );
}


Essas configurações são traduzidas para a interface do usuário da seguinte maneira:


Configuração do Phabricator


O tipo de valor de configuração é importante, pois o Phabricator o lê e renderiza um campo relevante para o tipo; por exemplo, bool fornecem um menu suspenso True/False (Verdadeiro/Falso).


Uso de valores de configuração


Quando quiser usar valores de configuração em outras extensões, o senhor pode fazer referência a esses valores de configuração por chave com PhabricatorEnv::getEnvConfig chamadas:



// Use PhabricatorEnv::getEnvConfig() to get config values
if(PhabricatorEnv::getEnvConfig('bugzilla.require_bugs') === true) {
  // ...
}


O valor retornado pelo getEnvConfig é do tipo definido na extensão de configuração.


Sou um grande fã do uso de valores de configuração definidos por meio de uma interface de usuário; a alternativa geralmente requer uma reimplantação e, em casos de emergência, esse é o pior cenário possível. Quando os valores são fáceis de definir, alterar e usar, o senhor se encontra em uma situação de ganho/ganho/ganho, e é assim que deve ser sempre!