POPO (Plain Old PHP Object) কি?
জাভাতে একটি লাইব্রেরী আছে POJO (Plain Old Java Object), যেটি মূলত JSON ডাটাকে প্লেইন জাভা অবজেক্টে রূপান্তর করে। অর্থাৎ JSON এর একেকটি অবজেক্ট জাভাতে প্রিডিফাইন্ড একেকটা ক্লাস, আর JSON একেকটা প্রোপার্টি ঐ প্রিডিফাইন্ড ক্লাসের একেকটা পাবলিক প্রোপার্টি যা সয়ংক্রিয়ভাবে JSON প্রোপার্টির সাথে ক্লাসের প্রোপার্টি ম্যাপ হয়ে যায়।গিটহাব লিংক: https://github.com/nahid/popo
সুবিধা কি?
সুবিধা হচ্ছে এটি কিছুটা Go এর স্ট্রাক্ট এর মতো বিহেব করে। ধরুন আপনি কোনো মেথডের প্যারামিটারে একটি JSON অবজেক্ট পাঠাবেন। কিন্তু সমস্যা হচ্ছে সেই প্যারামিটারে আপনি যেকোনো ধরনে JSON অবজেক্ট পাঠাতে পারবেন। অর্থাৎ আপনি নিচের যেকোনো অবজেক্ট সাপোর্ট করবে।
function someMethod(object $json)
{
// do something
}
পোস্ট এর অবজেক্ট
// post object
{
"title": "My blog",
"category": "personal",
"body": "some body"
}
ইউজার এর অজেক্ট
// user object
{
"name": "My Name",
"mobile": "0170042042"
}
এবার আমরা যদি এই দুটি অবজেক্টই someMethod এ পাস করি তবে দুটোই সাপোর্ট করবে। কিন্তু আমরা যদি নিচের মতো করে করি।
function someMethod(Post $post){ // do something}
Post.php
use Nahid\Popo\Entity;
class Post extends Entity
{
public $title = \Nahid\Popo\Types\Str::class;
public $category = \Nahid\Popo\Types\Str::class;
public $body = \Nahid\Popo\Types\Str::class;
}
এবার আমরা JSON পার্স করে যেই ডাটাকে Post এ পাস করি।
$post = new Post($data);
someMethod($post);
এখানে যদি আমরা Post ছাড়া অন্য কিছু পাস করি তাহলে সেটি সাপোর্ট করবে না। এবং JSON এর প্রোপার্টিজ যেগুলো Post ক্লাসের প্রোপার্টিজের সাথে ম্যাচ করবে সেটা অটোমেটিক বাইন্ড হবে যাবে ও আপনি ক্লাসের সেই প্রোপার্টি দিয়ে ঐ ডাটাকে এক্সেস করতে পারবেন।nahid/popo প্যাকেজটি মূলত এই কাজটি করার সুযোগ দিবে। আর এই পুরো প্যাকেজটি PHP 7 দিয়ে লেখা। চলুন প্যাকেজটির ব্যাবহার দেখি। ধরুন আমাদের নিচের মতো একটি JSON আছে।
//users.json
{
"name": "Meherunnessa Nazat",
"age": 1,
"gender": "female",
"profile": {
"username": "nazat",
"email": "nazat@myworld.io",
"address": {
"home_address": "Barisal",
"present_address": "Dhaka"
}
}
}
এবার আমরা এটির জন্য Entity ডিফাইন করবো, প্রথমে address এর জন্য, এরপরে profile এবং শেষে user. অবশ্য আপনাদের এরকমের কোনো অর্ডার মানতে হবে না।
class Address extends Entity
{
public $homeAddress = \Nahid\Popo\Types\Str::class;
public $presentAddress = \Nahid\Popo\Types\Str::class;
}
class Profile extends Entity
{
public $username = \Nahid\Popo\Types\Str::class;
public $email = \Nahid\Popo\Types\Str::class;
public $address = Address::class;
}
class User extends Entity
{
public $name = \Nahid\Popo\Types\Str::class;
public $age = \Nahid\Popo\Types\Integer::class;
public $gender = \Nahid\Popo\Types\Str::class;
public $profile = Profile::class;
}
এখন আমরা User ক্লাসের একটি অবজেক্ট তৈরী করবো উপরের JSON data দিয়ে।
$json = '{
"name": "Meherunnessa Nazat",
"age": 1,
"gender": "female",
"profile": {
"username": "nazat",
"email": "nazat@myworld.io",
"address": {
"home_address": "Barisal",
"present_address": "Dhaka"
}
}
}';
$user = new User(json_decode($json, true));
dump($user);
আউটপুট:
দেখুন POPO অটোমেটিক ডাটাকে অবজেক্টের সাথে বাইন্ড করে দিয়েছে এবং ক্লাসের সাথে ক্লাস ম্যাপ করেছে। সব থেকে মজার বিষয় এখানে আপনি JSON প্রোপার্টিজের টাইপ ডিফাইন করে দিতে পারবেন POPO types থেকে।আরও বিস্তারিত শিঘ্রই আসছে। এটা এখন বেটা স্টেজে আছে। প্রোডাকশন রেডি না। তাই প্রোডাকশনে ব্যবহার না করার অনুরোধ করা গেলো।
ধন্যবাদ
:)ক্রেডিটঃ NAHID BIN AZHAR