আমি আমার ম্যাপিং অ্যারেতে একটি নতুন সেগমেন্টআইডি (একই নামের সাথে) যুক্ত করতে চাই তবে ভিন্ন উপাদান সহ আইডি কিন্তু একই পদ্ধতিতে


14

নীচে ম্যাপারআইন্টারফেস.এফপি রয়েছে

আমি কনস্টে একটি if-অন্য বিবৃতি কীভাবে যুক্ত করব তা বোঝার চেষ্টা করছি। ম্যাপিং অ্যারে এরকম কিছু:

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 "লিন" বিভাগের বেশি প্রয়োজন gment হয়ত কোনও নতুন ফাংশন যুক্ত করুন এবং এই শর্তটি ব্যবহার করবেন?

নতুন ফাইল উত্তর ***

    <?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()];
    }

}

সুতরাং আপনি কী চান ম্যাপিং কনস্ট অ্যারেটি গতিশীল হোক? আপনি কনস্টের সাথে এটি করতে পারবেন না। সেই অ্যারেটি পেতে আপনি অন্য ফাংশনটি ব্যবহার করতে পারেন এবং প্রয়োজনে সংশোধন করতে পারেন
11:34

আপনি কী করতে চাইছেন তা আমি সত্যিই জানি না। আপনি কি অর্জন করতে চান?
স্টিফান ভেরকান্ট

উত্তর:


6

যেমন আপনি এখানে দেখতে পাচ্ছেন - কনস্ট ভেরিয়েবল পরিবর্তন বা যুক্তি ধরে রাখতে পারে না । লক্ষ্য করুন যে ইন্টারফেসটি যুক্তিও ধরে রাখতে পারে না - তাই আপনি আপনার ইন্টারফেসে এটি করতে পারবেন না।

আমি মনে করি আপনার ইস্যুটির আরও ভাল সমাধান হ'ল একটি বিমূর্ত ক্লাস ব্যবহার করা । আমি আপনার ইন্টারফেসের মতোই হব (আপনি এখানে বিভিন্ন বিষয়ে আলোচনা দেখতে পাবেন তবে আমি মনে করি এটি আপনার প্রয়োজনের জন্য একই হবে)।

আমি এটি হিসাবে অ্যাবস্ট্রাক্ট ক্লাস তৈরি করার পরামর্শ দেব:

abstract class AbstractMapper{
    // here add all the method from your 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'];

    // set your default mapping - notice those are private to disable access from outside
    private const MAPPING = ['LIN' => [
                                'LIN02' => 'NV', 
                                'LIN01' => 'processSku'], 
                             'PRF' => [
                                'PRF01' => 'processIncrementId']];
    private $mapToProcess = [];


    // when initiate this class modify your $mapping member according your logic
    function __construct() {
        $this->mapToProcess = self::MAPPING; // init as 
        if ($this->mapToProcess['LIN']['LIN02'] == 'NV')
            $this->mapToProcess['LIN']['LIN03'] = 'processSku';
        else if ($this->mapToProcess['LIN']['LIN04'] == 'NV')
            $this->mapToProcess['LIN']['LIN05'] = 'processSku';
     }

    // use method to get your process and don't use directly 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 [];
    }
}

ব্যবহারের উদাহরণ:

$obj  = New Obj();
print_r($obj->getProcess('LIN', 'LIN01'));

মনে রাখবেন যে আপনার যুক্তিটি পরিবর্তন হচ্ছে না তাই আমি নতুন ভেরিয়েবল রেখেছি এবং এটি নির্মাণের সময় সেট করেছি। আপনি যদি চান তবে আপনি এটি ফেলে দিতে পারেন এবং কেবল getProcessফাংশনের রিটার্ন মানটি সংশোধন করতে পারেন - সমস্ত যুক্তি সেখানে রেখে দিন।

আরেকটি বিকল্প হ'ল $mapToProcessজনসাধারণকে তৈরি করা এবং এটি সরাসরি অ্যাক্সেস করা তবে আমি অনুমান করি আরও ভাল প্রোগ্রামিং হ'ল গেটর পদ্ধতিটি ব্যবহার করা।

আশা করি এইটি কাজ করবে!


আমার শেষ ফাংশন পাবলিক ফাংশন ম্যাপের (অ্যারে $ বিভাগগুলি) এর ঠিক নীচে আমার পুরো ফাইলটিতে পুরো অ্যাবস্ট্রাক্ট ক্লাসটি সংহত / সংযুক্ত করতে সক্ষম হওয়া উচিত: অর্ডারআপডেটইন্টারফেস; ER এখানে
সিঙ্গলটন

সুতরাং এখন আমি কেবল সমস্ত পুরানো কোড ওভাররাইড করতে এবং এই বিমূর্ত ক্লাসটি ব্যবহার করতে পারি? আমি উত্তরটিকে সঠিক এবং খুব সহায়ক হিসাবে চিহ্নিত করেছি। @dWinder
একক

হ্যা, তুমি পারো. ইন্টারফেস এবং বিমূর্ত শ্রেণীর মধ্যে পার্থক্য রয়েছে তবে বেশিরভাগ ক্ষেত্রে এটি একই কাজ করে (আপনি পোস্টের শুরুতে লিঙ্কটিতে এটি সম্পর্কে পড়তে পারেন)।
dwinder

আমার মনে হয় যুক্তিটিতে আমার এখনও এই সঠিকটি যুক্ত করা দরকার? অন্যথায় যদি ($ এটি-> মানচিত্রটিপ্রসেস ['লিন'] ['লিন04'] == 'ভিএন') $ এই-> মানচিত্রটিপ্রসেস ['লিন'] ['লিন05'] = 'প্রসেসস্কু';
একা

1
আপনার এটিও যুক্ত করা উচিত। যুক্তিটি কোথায় হওয়া উচিত তার উদাহরণ হিসাবে আমি এটির কিছু রেখেছি। আমি ভাল হিসাবে যে সঙ্গে সম্পাদনা হবে কোড কভার করতে চান
dWinder

5

ধ্রুবক সংজ্ঞাটির মধ্যে আপনি যদি অন্য কোনও বিবৃতি যোগ করতে পারেন না। আপনি যা সন্ধান করছেন তার নিকটতম সম্ভবত এটি হ'ল:

const A = 1;
const B = 2;

// Value of C is somewhat "more dynamic" and depends on values of other constants
const C = self::A == 1 ? self::A + self::B : 0;

// MAPPING array inherits "more dynamic" properties of C
const MAPPING = [
    self::A,
    self::B,
    self::C,
];

আউটপুট দেবে:

0 => 1
1 => 2
2 => 3

অন্য কথায়, আপনার নিজের অ্যারে পৃথক ধ্রুবক থেকে আলাদা করতে হবে, তারপরে সমস্ত শর্তসাপেক্ষ সংজ্ঞায়িত করুন, তারপরে স্থির মানগুলির ফলে চূড়ান্ত মানচিত্রের অ্যারেটি তৈরি করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.