paggcerto-sa / paggcerto-sdk-php

Conjunto de funcionalidades para facilitar o uso em aplicativos desenvolvidos pela Paggcerto.
MIT License
3 stars 1 forks source link

Implementation of the hydratorObject method #68

Open brunolimame opened 5 years ago

brunolimame commented 5 years ago

O uso do getIfSet em vários campo pode ser automarizado usando um hydrator, facilitando a manutenção e a leitura do código.

Ao invés de chamar o método getIfSet para cada chave, junta todas em um array e hydrator se encarrega de todo o processo.

O método seria aplicado em Service/PaggcertoService.php

  /**
     * @param stdClass $object
     * @param array $keys
     * @param stdClass $response
     */
    protected function hydratorObject(stdClass $object, $keys = [], stdClass $response)
    {
        if (count($keys) > 0) {
            array_walk($keys, function ($key) use ($object, $response) {
                $object->$key = $this->getIfSet($key, $response);
            });
        }
    }

Um exemplo de aplicação em Service/CardPaymentService.php

Atual

https://github.com/paggcerto-sa/paggcerto-sdk-php/blob/8de9e55814be0f74d15ea87b293d86d093e19d0a/src/Service/CardPaymentService.php#L384-L412

Aplicando o hydrator

/**
     * @param stdClass $response
     * @return mixed
     */
    protected function fillEntity(stdClass $response)
    {
        $result = clone $this;
        $result->data = new stdClass();

        $listKeys = [
            "bins", "count", "amountCharged", "amountReceived", "id", "sellingKey", "status", "createdAt",
            "canceledAt", "completedAt", "amount", "amountPaid", "cancelable", "additionalInformation",
            "cardTransactions", "splitters", "bankSlips"
        ];
        $this->hydratorObject($result->data, $listKeys, $response);

        return $result->data;
    }
brunolimame commented 5 years ago

Uma outra opção de hydrator, agora também servindo como factory, criando um novo objeto e hidratando o mesmo.

   /**
     * @param array    $keys
     * @param stdClass $response
     *
     * @return $this
     */
    protected function hydratorNewObject($keys = [], stdClass $response)
    {

        if (count($keys) > 0) {
            $hydrated = clone($this);
            $hydrated->data = new stdClass();
            $this->hydratorObject($hydrated->data, $keys, $response);
            return $hydrated;
        }

        return $this;
    }

Aplicando hydrator

   /**
     * @param stdClass $response
     * @return mixed
     */
    protected function fillEntity(stdClass $response)
    {
        $listKeys = [
            "bins", "count", "amountCharged", "amountReceived", "id", "sellingKey", "status", "createdAt",
            "canceledAt", "completedAt", "amount", "amountPaid", "cancelable", "additionalInformation",
            "cardTransactions", "splitters", "bankSlips"
        ];
        return $this->hydratorNewObject($listKeys, $response);
    }
brunolimame commented 5 years ago

hydrator simples, que não clona o atual, cria um novo.

/**
     * @param array    $keys
     * @param stdClass $base
     *
     * @return $this|mixed
     */
    protected function hydratorNewSimpleObject($keys = [], stdClass $base)
    {
        if (count($keys) > 0) {
            $hydrated = new stdClass();
            $this->hydratorObject($hydrated, $keys, $base);
            return $hydrated;
        }

        return false;
    }

Aplicando hydrator

Atual

https://github.com/paggcerto-sa/paggcerto-sdk-php/blob/8de9e55814be0f74d15ea87b293d86d093e19d0a/src/Service/BusinessActivityService.php#L38-L53

Aplicando hydrator


  /**
     * @param stdClass $response
     *
     * @return mixed
     */
    protected function fillEntity(stdClass $response)
    {
        $this->data->banks = array_reduce($response->banks, function ($result, $bank) {
            $bankHydrated = $this->hydratorNewSimpleObject(["id", "name"], $bank);
            if($bankHydrated){
                  $return[] = $bankHydrated;
            }
            return $result;
        }, []);

        return $this->data->banks;
    }
MarcusViniciusSS commented 5 years ago

@brunolimame obrigado pela considerações a equipe irá trabalhar nisso. Assim que terminamos nossas prioridades aplicaremos essas mudanças, Obrigado.