Magento 2: maneira diferente de obter campo de uma coleção

8

Eu tenho essa classe auxiliar no Magento 2:

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    protected $_countryFactory;

    public function __construct(
         \Magento\Directory\Model\CountryFactory $countryFactory
    )
    {
         $this->_countryFactory = $countryFactory;
    }

    public function getCountryIsoCode($country = 'US')
    {
          $country = $this->_countryFactory->create()->getCollection();
          $country->addFieldToFilter('country_id', array('eq' => country));

          $countryCode = $country->getFirstItem()->getIso3Code());
          $countryCode2 = $country->getFirstItem()->getData('iso3_code'));

          // $countryCode => null
          // $countryCode2 => 'USA'

          return $countryCode;
     }
}

A função getCountryIsoCode () tem um exemplo como parâmetro ('US').
Não sei por que o getIso3Code () não funciona. Em vez disso, o getData () funciona perfeitamente.

No Magento2 não há mais "função php magic para obter o campo da tabela do banco de dados"?
Existe algo errado no meu código?

Giuseppe Morelli
fonte

Respostas:

7

O problema está 3no nome.
Acabei de testar e o getter mágico não funciona bem com dígitos no nome.
O método getIso3Codenão existe; portanto, o método __callé chamado definido em Magento\Framework\DataObject.
A getparte fica assim.

$key = $this->_underscore(substr($method, 3));
$index = isset($args[0]) ? $args[0] : null;
return $this->getData($key, $index);

o _underscoretransforma o nome do método na chave de dados necessária.
Aqui está a linha que importa.

$result = strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $name), '_'));

Acabei de executar este código em http://phpfiddle.org/ :

$name = 'iso3_code';
echo strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $name), '_'));

e para minha surpresa, mostrou, iso_3_codemas você esperava iso3_code.

Marius
fonte
Desta vez eu vencê-lo :-)
Rajeev K Tomy
2
Sim. Bom trabalho. Eu já marquei sua resposta com +1.
Marius
9

No Magento 2 também usa métodos mágicos get / set. Se você quiser ver essas mágicas. Por favor tente isto:

$countryId = $country->getFirstItem()->getCountryId();
echo $countryId;

Isso produzirá o country_idvalor do primeiro objeto conforme seu código.

Então agora a questão é o que acontece com a ligação getIso3Code(). Bem, aqui está a reviravolta. O getter mágico do Magento interpretará essa chamada como iso_3_codeobviamente indefinida, portanto você obtém nullcomo resultado.

Por que o Magento trata essa chamada dessa maneira porque, ele usa o preg_replace()método internamente para recuperar o código real do getter mágico que estamos usando. Isto significa que, quando você liga getCountryId(), o Magento tem uma lógica interna que rastreará o código real que você está procurando country_id. Essa mesma lógica interna falhará getIso3Code()devido à ocorrência desse número 3.

Portanto, nesse caso em particular, é melhor usar a getData('iso3_code')chamada.

Espero que isso lhe dê uma imagem clara.

Rajeev K Tomy
fonte