Magento 2: in modo diverso ottenere il campo di una raccolta


8

Ho questa classe di supporto in 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;
     }
}

La funzione getCountryIsoCode () ha un esempio come parametro ('US').
Non capisco perché getIso3Code () non funzioni. Invece getData () funziona perfettamente.

In Magento2 non ci sono più "funzioni magiche php per ottenere il campo della tabella del database"?
C'è qualcosa di sbagliato nel mio codice?

Risposte:


7

Il problema è 3nel nome.
Ho appena testato e il Magic Getter non gioca bene con le cifre nel nome.
Il metodo getIso3Codenon esiste, quindi viene invece __callchiamato il metodo in cui è definito Magento\Framework\DataObject.
La getparte si presenta così.

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

la _underscoretrasforma il nome del metodo nella chiave dei dati necessari.
Ecco la linea che conta.

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

Ho appena eseguito questo codice su http://phpfiddle.org/ :

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

e con mia sorpresa ha mostrato iso_3_codema te lo aspettavi iso3_code.


Questa volta ti ho battuto :-)
Rajeev K Tomy,

2
Sì. Bel lavoro. Ho già fatto +1 sulla tua risposta.
Marius

9

No Magento 2 utilizza anche metodi magici get / set. Se vuoi vedere quella magia. Per favore prova questo:

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

Questo produrrà il country_idvalore del primo oggetto secondo il tuo codice.

Quindi ora la domanda è cosa succede con la chiamata getIso3Code(). Bene, ecco il colpo di scena. Il getter magico di Magento interpreterà questa chiamata come iso_3_codechiaramente indefinita, quindi ottieni nullcome risultato.

Perché Magento tratta questa chiamata in questo modo perché utilizza preg_replace()internamente il metodo per recuperare il codice reale dal getter magico che stiamo utilizzando. Ciò significa che, quando chiami getCountryId(), Magento ha una logica interna che traccerà il vero codice che stai cercando country_id. Questa stessa logica interna fallirà in caso di getIso3Code()occorrenza di quel numero 3.

Quindi, in questo caso particolare, è meglio usare getData('iso3_code')call.

Spero che ti dia un'immagine chiara.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.