লারাভেল ৫: ইলোকোয়েন্ট এট্রিবিউট কাস্টিং


আমরা জানি লারাভেলের ইলোকোয়েন্ট ওআরএম এ কোন কোয়েরি চালালে যে ভ্যালু রিটার্ন করে সেটা সবসময়ই স্ট্রিং হিসেবে থাকে। এতে করে একটা সমস্যা প্রায়ই দেখা যায়। যেমন ধরুন, আমরা নিচের কোয়েরিটা চালালাম User নামের মডেলে-

$user = User::find($id);

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

{
    "id" => "1",
    "name" => "John Doe",
    "activated" => "0"
}

এক্ষেত্রে একটি সাধারন সমস্যা হচ্ছে ইউজার এক্টিভেটেড কিনা সেটি যদি আমরা চেক করি তাহলে সেক্ষেত্রে দেখা যাবে-

echo ($user.activated)? "Yes" : "No";
//output: Yes

এক্ষেত্রে আউটপুট আসবে Yes যদিও No আউটপুট আসা উচিৎ ছিল। এর কারন এক্টিভেটেড ফ্লাগটি স্ট্রিং হিসেবে আছে। ফ্লাগটি যদি বুলিয়ান ভ্যালু হিসেবে থাকতো তাহলে আর এই সমস্যাটা হতো না।

লারাভেল ৪.* এ আমরা এক্সেসর এবং মিউটেটর ব্যবহার করে এই সমস্যার সমাধান করতে পারতাম। মডেল ক্লাসে নিচের মেথডটি যুক্ত করে আমরা ভ্যালুটিকে বুলিয়ানে কাস্টিং করতে পারতাম-

public function getActivatedAttribute($value){
    return (boolean) $value;
}

লারাভেল ৫ এ আপনি একইভাবে এট্রিবিউট কাস্টিং করতে পারবেন। এছাড়া আরো একটি সহজ উপায় যুক্ত হয়েছে লারাভেল ৫ এ। সেটি হচ্ছে মডেলে $casts নামে একটি এসোসিয়েটিভ এরে যোগ করে সেটিতে ডেটাটাইপ ডিক্লেয়ার করে দেয়া। যেমন উপরের উদাহরনটিকে যদি নতুন পদ্ধতিতে কাস্টিং করতে চাই সেক্ষেত্রে লিখতে হবে-

proteced $casts = [
    'activated' => 'boolean'
];

শুধুমাত্র বুলিয়ানেই কাস্টিং করতে পারবেন তা না। boolean ছাড়াও আপনি integer, real, float, double, string, boolean, object এবং array তে কাস্ট করতে পারবেন।

এক্ষেত্রে বলে রাখা ভালো এরে কাস্টিং শুধুমাত্র ব্যবহৃত হয় যখন কোন কলামে জেসন সিরিয়ালাইজড ডেটা সেভ করা হয়। যেমন ধরুন আমাদের উদাহরনের ইউজার টেবিলে যদি অপশন নামে একটি কলাম থাকতো, এবং সেটিতে যদি সিরিয়ালাইজ ডেটা সেভ করা হতো তাহলে সেটি করা হতো এভাবে-

$user = User::find($id);

$user->options = [
    'email' => 'john@example.com',
    'age' => 20
];
$user->save();

এক্ষেত্রে ইউজারকে ডাম্প করলে আমরা অপশনের জায়গায় একটি সিরিয়ালাইড জেসন ডেটা পেতাম। কিন্তু আমরা যদি $casts এরেতে অপশন হিসেবে এরে সিলেক্ট করি সেক্ষেত্রে মডেল ডেটা রিটার্ন করার সময় অটোমেটিক আউটপুটকে ডিসিরিয়ালাইজ করবে।

লারাভেল ৫ এ প্যাকেজ ডেভেলপমেন্ট


লারাভেল ৪.* এ “illuminate/workbench” প্যাকেজ ব্যবহার করে খুব সহজেই আমরা লারাভেলের জন্য প্যাকেজ ডেভেলপ করতে পারতাম। কিন্তু লারাভেল ৫ এ সেটিকে লারাভেলের কোর থেকে বাদ দেয়া হয়েছে। আসলে টেইলর অটোয়েল(লারাভেলের জনক) মনে করেন, প্যাকেজগুলো ফ্রেমওয়ার্ক ইন্ডিপেন্ডেন্ট হওয়া জরুরী। তাই তিনি এ প্যাকেজটিকে লারাভেলের কোর থেকে বাদ দিয়েছেন। তবে আমরা চাইলে এ প্যাকেজটি ব্যবহার করে খুব সহজেই লারাভেল ৫ এর জন্য প্যাকেজ তৈরি করতে পারি।

এরজন্য প্রথমেই যা করতে হবে সেটি হচ্ছে লারাভেল ইনস্টলের পর “illuminate/workbench” প্যাকেজের “dev-develop” ব্রাঞ্চটিকে আপনার প্রজেক্টে পুল-ইন করে নিতে হবে। এটি করতে আপনি কম্পোজার ফাইলের রিকোয়ার অংশে নিচের লাইনটি যুক্ত করুন-

"require": {
    "laravel/framework": "5.0.*",
    "illuminate/workbench": "dev-master"
},

এরপর টার্মিনালে নিচের কমান্ডটি দিন-

    composer update

এরপর config/app.php ফাইলের providers এরেতে নিচের লাইনটি যুক্ত করতে হবে-

'providers' => [
    ...,
    'Illuminate\Workbench\WorkbenchServiceProvider',
]

এবার আপনার প্রজেক্টের কনফিগ ডিরেক্টরিতে workbench.php নামে একটি নতুন ফাইল তৈরি করুন এবং সে ফাইলটিতে নিচের অংশটুকু যুক্ত করে দিন-

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | Workbench Author Name
    |--------------------------------------------------------------------------
    |
    | When you create new packages via the Artisan "workbench" command your
    | name is needed to generate the composer.json file for your package.
    | You may specify it now so it is used for all of your workbenches.
    |
    */
    'name' => '',
    /*
    |--------------------------------------------------------------------------
    | Workbench Author E-Mail Address
    |--------------------------------------------------------------------------
    |
    | Like the option above, your e-mail address is used when generating new
    | workbench packages. The e-mail is placed in your composer.json file
    | automatically after the package is created by the workbench tool.
    |
    */
    'email' => '',
];

এই ফাইলের নাম এবং পাসওয়ার্ড অংশে প্যাকেজ রাইটারের নাম এবং ইমেইল এড্রেস লিখুন।

এবার আপনার কাজ শেষ। নতুন প্যাকেজ ডেভেলপমেন্ট শুরু করতে টার্মিনালে নিচের কমান্ডটি লিখুন-

php artisan workbench vendor/package

এই vendor এবং package এর জায়গায় আপনি আপনার প্যাকেজের ভেন্ডরের নাম এবং প্যাকেজের নাম লিখবেন।

কমান্ডটি দেয়ার পরে দেখবেন আপনার প্রজেক্টের রুট ডিরেক্টরিতে workbench নামে একটি ফোল্ডার তৈরি হয়েছে, এবং এই ফোল্ডারের ভেতরে আপনার প্যাকেজের জন্য একটি ফোল্ডার এবং অন্যান্য স্ক্যা-ফোল্ডিং ফাইল তৈরি হয়ে গেছে। ব্যস, শুরু করে দিন প্যাকেজ ডেভেলপমেন্ট।