Presento — PHP Data Presenter & Transformer

Nahid Bin Azhar
5 min readSep 19, 2019

--

Presento হলো PHP এর জন্য Data Presenter ও Transformer সল্যুসন। এটি মূলত API ডেভলপমেন্টের জন্য উপযোগী, কিন্তু আপনি এটি যেকোনো ডাটা ট্রান্সফরমেশনের জন্য ব্যবহার করতে পারবেন। Presento’র ব্যবহার খুবই সহজ ও সাবলীল, আপনি নিমেষেই এটি শিখে ফেলতে পারবেন। তো চলুন জেনে নেই কিভাবে Presento কাজ করে।

Github Link: https://github.com/nahid/presento

Requirements

  • PHP ≥ 7
  • ext-json

Installation

composer require nahid/presento

Configuration

এই প্যাকেজটি ব্যবহারের জন্য আপনাকে কোনো প্রকার কনফিগারেশনের প্রয়োজন পরবেনা।

Usage

Presento মূলত Presenter এবং Transformer এর সমন্বয়ে একটি প্যাকেজ। এখানে প্রেজেন্টার ডাটা রিপ্রেজেন্টেশনের জন্য ব্যবহার করা হয় এবং ট্রান্সফরমার ডাটা মডিফিকেশনের জন্য ব্যবহার করা হয়। আমরা নিচের ডাটাসেটের জন্য একটি প্রেজেন্টার তৈরী করবো:

$response = [
'id' => 123456,
'name' => 'Nahid Bin Azhar',
'email' => 'talk@nahid.im',
'type' => 1,
'is_active' => 1,
'created_at' => '2018-01-02 02:03:04',
'updated_at' => '2018-01-02 02:03:04',
'deleted_at' => '2018-01-02 02:03:04',
'projects' => [
[
'id' => 1,
'name' => 'Laravel Talk',
'url' => 'https://github.com/nahid/talk',
'license' => 'CC0',
'created_at' => '2016-02-02 02:03:04'
],
[
'id' => 2,
'name' => 'JsonQ',
'url' => 'https://github.com/nahid/jsonq',
'license' => 'MIT',
'created_at' => '2018-01-02 02:03:04'
]
]
];

আমরা চাচ্ছি এখানে এই ডাটাসেট থেকে `id`, `name`, `email`, `type`, `is_active` ও `projects` প্রোপার্টি গুলো দেখাতে। তো চলুন এর জন্য একটি প্রেজেন্টার বানাই যার নাম হবে UserPresenter

// UserPresenter.phpclass UserPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'id',
'name',
'email',
'type',
'is_active',
'projects',
];
}
}

Use Presenter


$user = new UserPresenter($response);
dd($user->get());

Output

দেখুন প্রেজেন্টারের present মেথডে যেসকল প্রোপার্টির কথা বলে দিয়েছি এখানে শুধু সেগুলোকেই দেখাচ্ছে। মজা না? হুম, মজা আরও বাকি। এবার আমরা চাচ্ছি id প্রোপার্টির নাম পরিবর্তন করে অর্থাৎ এ্যালিয়াস হিসেবে user_id করে দিবো। কারন হচ্ছে আমি অন্যকে এর অরিজিনাল প্রোপার্টি নাম দেখাতে চাচ্ছিনা। এটি খুবই সহজ, শুধু প্রেজেন্টারের present মেথডে key তে এ্যালিয়াস ও value তে প্রোপার্টির নাম বলে দিতে হবে, ঠিক নিচের মতো:

// UserPresenter.phpclass UserPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'user_id' => 'id',
'name',
'email',
'type',
'is_active',
'projects',
];
}

}

Output

Presento তে আরেকটি দারুন ফিচার হলো dot নোটেশন দিয়ে এ্যারেতে ট্রাভার্স করা। অর্থাৎ আপনি প্রেজেন্টারে dot দিয়ে অভ্যন্তরীন অন্য প্রোপার্টি এ্যারের ডাটা এ্যাক্সেস করতে পারবেন। আমরা এখন projects প্রোপার্টির প্রথম ইন্ডেক্সের name প্রোপার্টিটি কে top_package হিসেবে user কালেকশনে দেখাবো। চলুন দেখি কিভাবে করা যায়:

// UserPresenter.phpclass UserPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'user_id' => 'id',
'name',
'email',
'type',
'is_active',
'top_package' => 'projects.0.name',
'projects',
];
}
}

Output

কি পরিবেশটা সুন্দর না? কোনো হইচই আছে? আমি খারাপ কিছু করেছি 😷 ? এবার প্রশ্ন করতে পারেন তাহলে ট্রান্সফরমার কোথায় লাগবে? হা ভাই, ট্রান্সফরমার লাগবে।
ধরুন আমি user_id প্রোপার্টিটিকে এভাবে ইনক্রিমেন্টাল ভ্যালু হিসেবে দেখাতে চাচ্ছি না, এটাকে হ্যাশ করে দেখাবো। এটি কিভাবে করা যায় দেখি চলুন।
এর জন্য আমাদের প্রথমেই একটি ট্রান্সফরমার বানিয়ে নিতে হবে, আমরা UserTransformer বানাবো।

// UserTransformer.phpclass UserTransformer extends \Nahid\Presento\Transformer
{
public function getUserIdProperty($value)
{
return md5($value);
}
}

এবার এই ট্রান্সফরমারটিকে UserPresenter কে এসাইন করে দিবো। এজন্য আমাদের UserPresenter এ নতুন একটি মেথড যুক্ত করতে হবে নিচের মতো।

// UserPresenter.phppublic function transformer()
{
return UserTransformer::class;
}

Output

খেয়াল করলে দেখবেন আমি UserTransformer এ getUserIdProperty($value) নামে একটি মেথড লিখেছি। এর অর্থ হচ্ছে আমি ‍‍‍‍‍user_id কে ট্রান্সফর্ম করতে চাই। $value হলো ঐ প্রোপার্টির বর্তমান ভ্যালু।
আমরা তো user এর জন্য প্রেজেন্টার তৈরী করলাম, কিন্তু আপনি কি খেয়াল করেছেন ইউজারের ভিতরে projects নামে আরেকটি প্রোপার্টি আছে যে নিজেও আরেকটি কালেকশন, এবং যার জন্য একটি প্রেজেন্টার প্রয়োজন?
চলুন projects এর জন্য একটি প্রেজেন্টার বানাই:

// ProjectPresenter.phpclass ProjectPresenter extends \Nahid\Presento\Presenter
{
public function present() : array
{
return [
'id',
'name',
'url',
'license',
'created_at',
];
}

public function transformer()
{
return ProjectTransformer::class;
}
}

এবং এর জন্য একটি ট্রান্সফর্মার বানিয়ে নেই, যেখানে আমরা projects এর created_at টাইমকে ফরম্যাট করে অন্যভাবে প্রেজেন্ট করবো:‍

// ProjectTransformer.phpclass ProjectTransformer extends \Nahid\Presento\Transformer
{
public function getCreatedAtProperty($value)
{
return date('d M, Y', strtotime($value));
}
}

একটু কাজ বাকি, আমরা এবার UserPresenter ক্লাসের projects প্রোপার্টিকে‍‍‍‍‍ ProjectPresenter দিয়ে ম্যাপ করবো নিচের মতো করে।

// UserPresenter.phppublic function present() : array
{
return [
'user_id' => 'id',
'name',
'email',
'type',
'is_active',
'projects' => [ProjectPresenter::class => ['projects']],
];
}

ব্যাস শেষ, এবার আউটপুট দেখই:

Output

কি মজা না? projects প্রোপার্টির প্রত্যেকটি এনটিটিতে ProjectPresenter এর ইফেক্ট পড়েছে।

ফাইনালি যেটা দেখাবো সেটা খুবই গুরুত্বপূর্ন। আমরা তো এখানে ডিরেক্ট পিএইচপি এর প্লেইন এ্যারে ব্যবহার করেছি। কিন্তু এমন অনেক সিনারিও আসবে যেখানে আপনি প্লেইন এ্যারে হয়তো পাবেন না। যেমন ধরুন লারাভেলের মডেল ইন্সট্যান্স রেসপন্সে পেলেন, তো এটি নিয়ে কিভাবে কাজ করবেন? এই কাজটি করার জন্য এই প্রেজেন্টারে একটি মেথড আছে convert নামে। যার কাজ হলো প্রেজেন্টারে কোনো ডাটা আসার সাথে সাথে এর ভিতর দিয়ে পাস করা। আপনি এই মেথডকে ওভাররাইড করে দিলেই কাজ হয়ে যাবে। নিচের উদাহরনটি দেখুন, যদি আপনার কাছে লারাভেলে Eloquent Model ইন্সট্যান্স আসে তবে নিচের মতো করে নিতে পারেন।
‍‍‍

// UserPresenter.phppublic function convert($data)
{
if ($data instanceof Model) {
return $data->toArray();
}

return $data;
}

ব্যাস দু মিনিটেই হয়ে গেলো ম্যাগী নুডুলস 😝
ধন্যবাদ 😀

--

--