Categories
PHP

Laravel 4: Sending Emails

Laravel 4 uses SwiftMailer library behind the stage. They have wrapped the SwiftMailer functionality in elegant and easy to use APIs for delivering emails.

The Mail::send() API is straight forward, it takes these as argument –

# The email template to render. You can pass an array for sending both text and html emails.
# The data array which contains the values for the email template.
# A closure to configure the message. The closure is passed an instance of SwiftMailer and you can use the same set of configuration you can use with SwiftMailer.

Choosing a Mail Transport

Laravel 4 allows easy configuration of the mail transport in app/config/mail.php file. The framework has drivers for smtp, PHP’s mail() function and sendmail. If you have a local smtp server running, choose the smtp driver. Set the host to localhost and port to 25.

Pretend Sending Mail

Laravel4 has a nice feature for testing emails on local machines where you probably don’t have a mail server installed and/or configured. You can switch “pretend” in the above configuration to true or use Mail::pretend(TRUE) before making a call to Mail::send(). This will not try to deliver the mail but make a log in the application log file. You can find the logs files in – “app/storage/logs” directory.

Categories
Bangla PHP

পিএইচপি ৫.৫ – নতুন কি এলো?

গত ২০শে জুন পিএইচপি ৫.৫ রিলিজ পেলেও আপগ্রেড করা হয়ে ওঠেনি । আজ একটু আগে আপগ্রেড করেই ভাবলাম নতুন ফিচারগুলো সম্বন্ধে লিখে ফেলি । তো আসুন দেখে নেই উল্লেখযোগ্য নতুন ফিচারগুলো কি কি ।

#১ – জেনারেটর

আমরা পিএইচপিতে আইটারেটর ব্যবহার করার জন্য এতদিন Iterator ইন্টারফেইস ব্যবহার করে এসেছি । কিন্তু নতুন আসা জেনারেটর সিনট্যাক্স ব্যবহার করে আমরা আইটারেশনটা আরো সহজে হ্যান্ডল করতে পারবো ।

জেনারেটর আসলে কি? জেনারেটর হচ্ছে ফাংশনের মতই কিন্তু ফাংশন একবার মাত্র ভ্যালু রিটার্ন করতে পারে কিন্তু জেনারেটর যতবার খুশি ভ্যালু রিটার্ন করতে পারে yield কিওয়ার্ডটি ব্যবহার করে । জেনারেটর থেকে রিটার্ন করা সব ভ্যালু একটি সিকুয়েন্স হিসেবে থাকে যেটি কিনা আইটারেট করা যায় অন্যসব আইটারেটর (যেমন: এ্যারে) এর মত করেই (যেমন: foreach ব্যবহার করে) । জেনারেটর যেহেতু একটি একটি করে ভ্যালু রিটার্ন করে, সেহেতু সব ডাটা এক সাথে এ্যারে তে রাখার প্রয়োজন পড়ে না । ফলে মোমোরী সেইভ করা সম্ভব । যেমন, range(0,1000000) ব্যবহার করে যদি আমরা একটি এ্যারে তৈরি করি এক মিলিয়ন সংখ্যার, তাহলে তার জন্য আমাদের প্রায় ১০০ মেগাবাইট মেমোরী প্রয়োজন হবে । একই কাজ যদি জেনারেটর ব্যবহার করে করি তবে থিওরেটিক্যালি কখনোই ১ কিলোবাইট এর বেশী মেমোরী ব্যবহারের প্রয়োজন পড়বে না ।

চলুন জেনারেটরের কোড এক্সাম্পল দেখি –

আউটপুট:

#২ – finally ব্লক

পিএইচপিতে আমরা এক্সেপশন হ্যান্ডলিং এর জন্য এতদিন try..catch ব্লক ব্যবহার করে এসেছি । এবার আমরা সেই সাথে পাচ্ছি আরেকটি নতুন ব্লক – finally । এই ব্লক সব সময়ই রান করবে । অর্থাৎ এক্সেপশন থাকুক বা নাই থাকুক এই ব্লক পিএইচপি চোখ বুজে এক্সিকিউট করবে । এই ব্লকের সুবিধাটা কি? ধরুন আপনি try ব্লকে একটি ডাটাবেইজ কানেকশন ওপেন করেছিলেন । এরপর পেলেন একটি এক্সেপশন এবং সেটিকে হ্যান্ডল করলেন কিন্তু ঐ ডাটাবেইজ কানেকশন? ওটা তো বন্ধ করা দরকার, তাই না? এই সুযোগটাই আপনি পাচ্ছেন finally ব্লকে ।

পিএইচপি ম্যানুয়াল থেকেই কোড স্যাম্পল তুলে দেই –

#৩ – পাসওয়ার্ড হ্যাশিং এপিআই

পাসওয়ার্ড হ্যাশিং সহজ করার জন্য এই ভার্সনে এসেছে – password_hash() এবং password_verify() । password_hash ফাংশনটি দুইটি প্যারামিটার নিয়ে কাজ করে – টেক্সট পাসওয়ার্ড, এবং হ্যাশিং এ্যালগরিদম (অনেকগুলো প্রিডিফাইন্ড কনস্টান্ট আছে) ।

উদাহরণ:

আউটপুট:

#৪ – ডিরেফারেন্সিং

এবার এ্যারে এবং স্ট্রিং লিটারেলের বেলায়ও ডিরেফারেন্সিং ফিচার যোগ করা হয়েছে –

#৫ – ক্লাস নেইম রেজুলেশন

ধরুন আপনি কোন একটি নেইমস্পেইস থেকে একটি ক্লাস ইম্পোর্ট করেছেন । এখন যদি আপনার প্রয়োজন হয় ঐ ক্লাস এর নেইমস্পেইস সহ পুরো নামের, তখন কি করবেন? আর বিশেষ করে যদি use…as ব্যবহার করে ক্লাসটিকে অন্য নামে ইম্পোর্ট করা হয় তবে ব্যাপারটি আরো জটিল হয়ে দাড়ায় । এই সমস্যার সহজ সমাধান নিয়ে এসেছে ক্লাস নেইম রেজুলেশন । যেকোনো ক্লাসে class কিওয়ার্ড ব্যবহার করে ফুল নেইম পাওয়া যাবে এভাবে – MyClass::class

আউটপুট:

অন্যান্য পরিবর্তন

অন্যান্য পরিবর্তনের মধ্য আছে –

# foreach লুপে list() ব্যবহার করা যায়
# foreach লুপে নন-স্ক্যালার (স্ট্রিং বা নাম্বার বাদের অন্য টাইপের ভ্যালু) ব্যবহার করা যায়
# OpCache এর মাধ্যমে পার্ফরমেন্স এ ইম্প্রুভমেন্ট

Categories
Bangla PHP

ডিজাইন প্যাটার্ন – ফ্যাক্টরি মেথড

আপডেট:

রিফাত ভাইয়ের সাজেশন অনুসারে দুটো জিনিস যোগ করলাম –

# namespace এর ব্যবহার
# instanceof ব্যাবহার করে নিশ্চিত হওয়া যে রিকোয়েস্ট করা ক্লাস আসলে মিডিয়া ইন্টারফেইস ইম্প্লিমেন্ট করে ।

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


ফ্যাক্টরি মেথড প্যাটার্ন এর কাজ তার নাম থেকেই সহজে অনুমান করা যায় । এই প্যাটার্নে একটি ফ্যাক্টরি অবজেক্ট এ একটি মেথড থাকে যার কাজ হচ্ছে আমাদের প্রয়োজনমত অবজেক্ট তৈরি করে দেওয়া । এই অবজেক্টগুলো সাধারণত একই ধরণের হয়ে থাকে । উদাহরণ হিসেবে আমরা ভাবতে পারি একটি কন্টেন্ট ম্যানেজমেন্ট সলিউশন এর কথা (যেমন: ওয়ার্ডপ্রেস, জুমলা কিংবা দ্রুপাল) যেখানে নানা ধরণের কন্টেন্ট থাকে । থাকতে পারে অডিও, ভিডিও কিংবা ফটো । এগুলোকে এক সাথে আমরা মিডিয়া হিসেবে চিন্তা করতে পারি । আবার দেখুন, এই মিডিয়াগুলোর কিছু সাধারণ বৈশিষ্ট্য থাকতে পারে, যেমন: সব মিডিয়ারই একটি পাবলিক URL থাকে, সার্ভারে লোকেশন বোঝানোর জন্য ফাইল পাথ থাকে, মিডিয়ার ফাইল সাইজ থাকে, সেই সাথে থাকে কোনটি কোন টাইপের মিডিয়া । এরকম ক্ষেত্রে আমরা একটি মিডিয়া ইন্টারফেইস তৈরি করে নিবো এবং আমাদের স্বতন্ত্র মিডিয়াগুলো এই ইন্টারফেইস ইম্প্লিমেন্ট করবে । ইন্টারফেইস ব্যবহার করে আমরা অবজেক্টগুলোর সাধারণ আচরণ নির্দিষ্ট করে দিতে পারি । যেমন আমরা সব গুলো অবজেক্টকে বাধ্য করতে পারি একটি getType() মেথড ইম্প্লিমেন্ট করতে যেটা আমাদের বলে দিবে ঐ অবজেক্টটি কোন টাইপের মিডিয়া । ইন্টারফেইসের মাধ্যমে ফরমাল একটি স্ট্রাকচার দাড় করানোর কনসেপ্টটি ডিজাইন বাই কন্ট্র্যাক্ট হিসেবে পরিচিত ।

এরপর আমরা একটি মিডিয়া ফ্যাক্টরি ক্লাস ডিজাইন করবো যার একটি স্ট্যাটিক মেথড থাকবে factory() নামে । এই মেথডে আমরা টাইপ পাস করে দিলে সে আমাদের ঐ টাইপের অবজেক্ট দিবে । স্ট্যাটিক মেথড ব্যবহার করবো যাতে নতুন অবজেক্ট তৈরি করার জন্য ফ্যাক্টরি অবজেক্ট এর কোন ইনস্ট্যান্স তৈরি করা না লাগে । আমরা যাতে সরাসরি MediaFactory::factory() কল করতে পারি সেজন্যই স্ট্যাটিক মেথড ।

আমরা এখন খুব সাধারণ একটি উদাহরণ দেখবো পিএইচপি তে –

এখানে দেখুন, আমাদের একটি Media ইন্টারফেইস আছে যেটি একটি পাবলিক মেথড ডিফাইন করেছে getType() । আমাদের Audio, Video এবং Photo ক্লাস এই ইন্টারফেইসকে ইম্প্লিমেন্ট করেছে নিজের মত করে । MediaFactory ক্লাসের factory() আমাদের কাছে $type প্যারামিটার চায় । টাইপ বলে দিলে সে সেই টাইপের অবজেক্ট তৈরি করে রিটার্ন করে ।

এবার আমরা দেখি কিভাবে আমাদের কোডে এই ফ্যাক্টরি মেথড প্যাটার্ন ব্যবহার করবো –

এখানে আমরা প্রতিবার MediaFactory এর কাছ থেকে আমাদের প্রয়োজনীয় টাইপের অবজেক্ট চেয়ে নিচ্ছি । এই কোডের আউটপুটটা কেমন হবে? আসুন দেখে নেই –

তো, এটাই হলো ফ্যাক্টরি প্যাটার্ন যেখানে একটি ফ্যাক্টরি মেথড আমাদের ফরমায়েশ মত অবজেক্ট তৈরি করে দেয় 🙂