Magento 2: другой способ получить поле коллекции

8

У меня есть этот вспомогательный класс в 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;
     }
}

Функция getCountryIsoCode () имеет пример в качестве параметра ('US').
Я не понимаю, почему getIso3Code () не работает. Вместо этого getData () работает отлично.

В Magento2 больше нет "магической функции php для получения поля таблицы базы данных"?
Что-то не так в моем коде?

Джузеппе Морелли
источник

Ответы:

7

Проблема 3в названии.
Я только что проверил, и магический получатель не очень хорошо играет с цифрами в названии.
Метод getIso3Codeне существует, поэтому вместо этого __callвызывается метод , определенный в Magento\Framework\DataObject. Часть выглядит следующим образом .
get

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

_underscoreпреобразует имя метода в ключ данных , которые необходимы.
Вот линия, которая имеет значение.

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

Я только что запустил этот код на http://phpfiddle.org/ :

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

и к моему удивлению это показало, iso_3_codeно вы ожидали iso3_code.

Мариус
источник
На этот раз я победил тебя :-)
Раджив К Томи
2
Ага. Хорошо сделано. Я уже добавил +1 к вашему ответу.
Мариус
9

Никакой Magento 2 также не использует магические методы get / set. Если вы хотите увидеть это волшебство. Пожалуйста, попробуйте это:

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

Это выведет country_idзначение первого объекта согласно вашему коду.

Итак, теперь вопрос в том, что происходит с вызовом getIso3Code(). Ну, вот поворот. Магический получатель Magento будет интерпретировать этот вызов как iso_3_codeявно неопределенный, поэтому вы получите nullрезультат.

Почему Magento так обрабатывает этот вызов, потому что он использует preg_replace()метод для извлечения реального кода из используемого нами волшебного добытчика. Это означает, что когда вы звоните getCountryId(), у Magento есть внутренняя логика, которая будет отслеживать реальный код, который вы ищете country_id. Эта же внутренняя логика потерпит неудачу из- getIso3Code()за появления этого числа 3.

Так что в этом конкретном случае лучше использовать getData('iso3_code')вызов.

Надеюсь, что это даст вам четкую картину.

Раджив К Томи
источник