Ниже находится MapperInterface.php
Я пытаюсь выяснить, как добавить оператор if-else в const. картографический массив. Примерно так:
if (LIN02 == “VN”)
o Treat LIN03 as the SKU
· else if (LIN04 == “VN”)
o Treat LIN05 as the SKU
<?php
declare(strict_types=1);
namespace Direct\OrderUpdate\Api;
use Direct\OrderUpdate\Api\OrderUpdateInterface;
/**
* Interface MapperInterface
* Translates parsed edi file data to a \Direct\OrderUpdate\Api\OrderUpdateInterface
* @package Direct\OrderUpdate\Api
*/
interface MapperInterface
{
/**
* Mapping array formatted as MAPPING[segemntId][elemntId] => methodNameToProcessTheValueOfElement
* @var array
*/
const MAPPING = [
'DTM' => ['DTM02' => 'processCreatedAt'], // shipment.created_at
'PRF' => ['PRF01' => 'processIncrementId'], // order.increment_id
'LIN' => ['LIN05' => 'processSku'], // shipment.items.sku
'SN1' => ['SN102' => 'processQty'], // shipment.items.qty
'REF' => ['REF02' => 'processTrack'] // shipment.tracks.track_number, shipment.tracks.carrier_code
];
/**
* Mapping for carrier codes
* @var array
*/
const CARRIER_CODES_MAPPING = ['FED' => 'fedex'];
/**
* @return array
*/
public function getMapping(): array;
/**
* @param array $segments
* @return OrderUpdateInterface
*/
public function map(array $segments): OrderUpdateInterface;
}
Я надеюсь, что в этом есть смысл. Не уверен, что есть лучший способ сделать это, но в конечном счете мне нужно более 1 "LIN" идентификатор сегмента. Может быть, добавить новую функцию и использовать это условие?
НОВЫЙ ФАЙЛ ОТВЕТ ***
<?php
declare(strict_types=1);
namespace Direct\OrderUpdate\Api;
use Direct\OrderUpdate\Api\OrderUpdateInterface;
/**
* Abstract Mapper
* Translates parsed edi file data to a \Direct\OrderUpdate\Api\OrderUpdateInterface
* @package Direct\OrderUpdate\Api
*/
abstract class AbstractMapper{
// Here we add all the methods from our interface as abstract
public abstract function getMapping(): array;
public abstract function map(array $segments): OrderUpdateInterface;
// The const here will behave the same as in the interface
const CARRIER_CODES_MAPPING = ['FED' => 'fedex'];
// We will set our default mapping - notice these are private to disable access from outside
private const MAPPING = ['LIN' => [
'LIN02' => 'VN',
'LIN01' => 'processSku'],
'PRF' => ['PRF01' => 'processIncrementId'],
'DTM' => ['DTM02' => 'processCreatedAt'],
'SN1' => ['SN102' => 'processQty'],
'REF' => ['REF02' => 'processTrack']];
private $mapToProcess = [];
// When we initiate this class we modify our $mapping member according to our new logic
function __construct() {
$this->mapToProcess = self::MAPPING; // init as
if ($this->mapToProcess['LIN']['LIN02'] == 'VN')
$this->mapToProcess['LIN']['LIN03'] = 'processSku';
else if ($this->mapToProcess['LIN']['LIN04'] == 'VN')
$this->mapToProcess['LIN']['LIN05'] = 'processSku';
}
// We use this method to get our process and don't directly use the map
public function getProcess($segemntId, $elemntId) {
return $this->mapToProcess[$segemntId][$elemntId];
}
}
class Obj extends AbstractMapper {
// notice that as interface it need to implement all the abstract methods
public function getMapping() : array {
return [$this->getMapping()];
}
public function map() : array {
return [$this->map()];
}
}
class Obj extends AbstractMapper {
// notice that as interface it need to implement all the abstract methods
public function getMapping() : array {
return [$this->getMapping()];
}
public function map() : array {
return [$this->map()];
}
}
Ответы:
Как вы можете видеть здесь - переменная const не может быть изменена или содержит логику . Обратите внимание, что интерфейс не может содержать логику, поэтому вы не можете сделать это в своем интерфейсе.
Я думаю, что лучшим решением для вашей проблемы является использование абстрактного класса . Я буду таким же, как ваш интерфейс (вы можете увидеть обсуждение различных здесь, но я думаю, что это будет то же самое для ваших нужд).
Я бы порекомендовал создать абстрактный класс так:
Теперь вы можете объявить объект, который унаследован как:
Пример для использования:
Обратите внимание, что кажется, что ваша логика не меняется, поэтому я добавил новую переменную и установил ее во время построения. Если вы хотите, вы можете сбросить его и просто изменить возвращаемое значение
getProcess
функции - поместите всю логику туда.Другой вариант - сделать
$mapToProcess
общедоступным и получить к нему доступ напрямую, но я полагаю, что лучшее программирование - использовать метод getter.Надеюсь, это поможет!
источник
Вы не можете добавить оператор if-else внутри определения константы. Наиболее близким к тому, что вы ищете, является, вероятно, это:
Будет выводить:
Другими словами, вам нужно будет разбить ваш массив на отдельные константы, затем выполнить все условные определения, а затем построить окончательный массив MAPPING из полученных значений констант.
источник