লারাভেল ব্লেডের সাথে অ্যাঙ্গুলার বা অন্যান্য জাভাস্ক্রিপ্ট টেমপ্লেটিংয়ের ব্যবহার


Angular_Laravel

আপনারা ইতোমধ্যে জানেন লারাভেলের টেমপ্লেটিং ইঞ্জিনের নাম ব্লেড আর এতে যে কোন ভ্যালু প্রিন্ট করার জন্য ডাবল কার্লি ব্রাকেট ব্যবহার করা হয়। যেমন-

Total Student: {{ $totalStudent }}

এখন অনেক জাভাস্ক্রিপ্ট লাইব্রেরি এবং টেমপ্লেটিং ইঞ্চিনও এই একই সিনট্যাক্স ব্যবহার করে। যেমন- অ্যাঙ্গুলারজেএস, ভিউজেএসের মত জাভাস্ক্রিপ্ট লাইব্রেরি বা মাসতেশ(mustache) বা হ্যান্ডেলবারের মত টেমপ্লেটিং লাইব্রেরি। সেক্ষেত্রে আপনি লারাভেলের ব্লেড আর জাভাস্ক্রিপ্ট টেমপ্লেটিং ইঞ্জিনের মধ্যে কলিশন হয় এবং আপনার কোড ঠিকমত কাজ করে না।

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

আপনি আপনার রাউট ফাইলের শুরুতেই লিখতে পারেন-

//For changing content tag
Blade::setContentTags('<%', '%>');

//For changing escaped content
Blade::setEscapedContentTags('<%%', '%%>');

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

আপনি চাইলে জাভাস্ক্রিপ্ট ইঞ্জিনের সিনট্যাক্সও পরিবর্তন করতে পারবেন। এখন একেক জাভাস্ক্রিপ্ট লাইব্রেরির সিনট্যাক্স যেহেতু একেক রকম, এক্ষেত্রে আমরা অ্যাঙ্গুলারের উদাহরন দেখি যেহেতু এটি সবচেয়ে বেশি ব্যবহৃত।

var sampleApp = angular.module('sampleApp', [], function($interpolateProvider) {
    $interpolateProvider.startSymbol('<%');
    $interpolateProvider.endSymbol('%>');
});

এবার চলুন দেখি দ্বিতীয় পদ্ধতি। এটা সবচেয়ে সহজ এবং এর জন্য আপনাকে কোন কনফিগারেশনও ঠিক করতে হবে না। যে ভ্যালুগুলো আপনি চান ব্লেড এক্সেপ করে যাক, আপনি সেগুলির শুরুতে শুধুমাত্র একটি @ সিম্বল বসিয়ে দিন। যেমন-

Total Student: @{{ $totalStudent }}

ব্যস হয়ে গেল। তো শুরু করে দিন লারাভেলের সাথে জাভাস্ক্রিপ্ট টেমপ্লেটিং।

হ্যাপি কোডিং…

উবুন্টু ১৪.০৪ ভার্সনে পিএইচপি ৫.৬ ইনস্টল করা


উবুন্টুতে পিএইচপি

উবুন্টুর সর্বশেষ এলটিএস রিলিজ হচ্ছে উবুন্টু ১৪.০৪। কিন্তু এর অফিশিয়াল রিপোজিটরিতে পিএইচপি ৫.৫.৯ ভার্সন দেয়া আছে। আপনি যদি উবুন্টুতে পিএইচপি ৫.৬ ভার্সন ইনস্টল করতে চান তাহলে সেটা অফিশিয়াল রিপোজিটরি থেকে করতে পারবেন না।

চিন্তার কিছু নেই। আপনি খুব সহজেই আদ্রেজ সুরির তৈরি করা পিপিএ যোগ করে, একটা কমান্ডের মাধ্যমেই পিএইচপি ৫.৬ ইনস্টল দিতে পারবেন। এর জন্য প্রথমে আপনাকে রিপোজিটরি যুক্ত করতে হবে নিচের কমান্ডের মাধ্যমে-

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php5-5.6

এবার রিপোজিটরি লিস্টিং আপডেট করুন, এবং কোন প্যাকেজ আপগ্রেড করার থাকলে সেটিও করুন। এই আপগ্রেড অবশ্য অপশনাল। আপনি চাইলে না করলেও পারেন।

sudo apt-get update
sudo apt-get upgrade

এবার নিচের কমান্ডের মাধ্যমে পিএইচপি ৫.৬ ইনস্টল করুন। তবে আপনার পিসিতে যদি আগে থেকেই পিএইচপি ইনস্টল করা থাকে তাহলে আপগ্রেড কমান্ডের মাধ্যমে অলরেডি পিএইচপি ৫.৬ ইনস্টল হয়ে যাওয়ার কথা।

sudo apt-get install php5

এবার চেক করতে টার্মিনালে লিখুন-

php -v

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

Upgrading a project from Laravel 5.0 to 5.1


Laravel just released it’s first LTS relase two days back. I was very excited about this release and can’t wait to upgrade my existing project to the latest version.

I have just updated a laravel 5.0 project to laravel 5.1. It was quiet a big project around 10 thousand line and 6 people working it. It was on latest iteration on laravel 5.0 branch which is 5.0.33. It’s a fairly simple task and took around 50 minutes. Let’s get started.

Take a backup

At first take a backup of your existing project so that if anything goes wrong you could restore. If you are using git you could make a different brunch of your update-

git checkout -b update 

Update bootstrap/autoload.php file

Previouslycompiled file was in /storage/framework directory but in 5.1 it is in /bootstrap/autoload directory. So, change the $compiledPath variable to this-

$compiledPath = __DIR__.'/cache/compiled.php';

Create bootstrap/cache directory

Then create bootstrap/cache directory and give write permission to it, becasue laravel will put it’s compiled.php, routes.php, config.php, and services.json file in it. To do this run below command to console-

sudo chmod 755 -R bootstrap/cache

Then create a .gitignore file in this directory and put following content in it-

*
!.gitignore

Authentication

If you are not using laravel’s default authentication scaffold then leave this section. If you are using then at first go to app/Http/Controllers/Auth/AuthController.php file. At first remove two dependencies from the controller. Then go to app/Services/Registrar.php file and copy validator and create method from it and paste it to AuthController. Then also import App\User and Illuminate\Support\Facade\Validator at the top of this class. After that delete Registrar class entirely. After doing all those things AuthController Will be look like this-

<?php namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use App\User;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller {

	/*
	|--------------------------------------------------------------------------
	| Registration & Login Controller
	|--------------------------------------------------------------------------
	|
	| This controller handles the registration of new users, as well as the
	| authentication of existing users. By default, this controller uses
	| a simple trait to add these behaviors. Why don't you explore it?
	|
	*/

	use AuthenticatesAndRegistersUsers;


	protected $redirectTo = '/';

    /**
	 * Create a new authentication controller instance.
	 *
	 * @return void
	 */
	public function __construct()
	{
		$this->middleware('guest', ['except' => 'getLogout']);
	}

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    public function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|confirmed|min:6',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    public function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }

}

Also remove the dependency from PasswordController‘s constructor method. Those are no longer needed.

Validation

If you don’t override any of the default validator method then you are good to go to the next section. If you do override formatValidationErrors method on your BaseController class then typehint Illuminate\Contracts\Validation\Validator class to the instead of create an instance of Illuminate\Validation\Validator class.

Do the same thing for formatErrors method also. Typehint Illuminate\Contracts\Validation\Validator class instead of create an instance of Illuminate\Validation\Validator class.

Eloquent

Eloquent’s create method now can applied with no parameter. So, If you are overriding this class, make sure you pass an empty array as a default parameter to this method. This will be look like this-

public static function create(array $attributes = [])
{
    // Your custom implementation
}

If you are overriding the find method in your own models and calling parent::find() within your custom method, you should now change it to call the find method on the Eloquent query builder. This will look like this-

public static function find($id, $columns = ['*'])
{
    $model = static::query()->find($id, $columns);

    // ...

    return $model;
}

Date Formatting

In 5.0 you could change the format of storage of date field by override getDateFormat method. This is still applicble but you could also use the more cleaner way to do this. Simply specify a $dateFormat property to the model declaring the fields you want in date format and you are good to go.

This is also applied for serializing model to array or JSON. You can override serializeDate(DateTime $date) method to do this.

The Collection Class

I use the collection class a lot, I think you also do, as eloquent and query builder returns collection.

Previously the sort method modify the existing collection. But from 5.1 it will return a completely new instance of collection. Take a look-

$collection = $collection->sortBy('name');

The groupBy method now returns an instance of collection for each of it’s item. You could map over the collection for getting previous format-

$collection->groupBy('type')->map(function($item)
{
    return $item->all();
});

lists method now return collection instead of array. To get array form that-

$collection->lists('id')->all();

Commands & Handlers

Commands are now renamed to Jobs and Handlers are now renamed to Listeners. But This change is backward compatible. So, you are good to go without modifying it, but my suggesstion is rename the files and fix namespaces for your commands and events classes.

Tests

Just add a protected $baseUrl property to App\TestCase class and you are good to go.

protected $baseUrl = 'http://localhost:8000';

Amazon Web Services SDK

If you are using amazon web service then update you sdk by defining the version to composer.json file and do a composer update.

"league/flysystem-aws-s3-v3": "~1.0"

Update

After doing all these things go to composer.json file and change the require object like this-

"require": {
    "php": ">=5.5.9",
    "laravel/framework": "5.1.*"
},
"require-dev": {
    "fzaninotto/faker": "~1.4",
    "mockery/mockery": "0.9.*",
    "phpunit/phpunit": "~4.0",
    "phpspec/phpspec": "~2.1"
},

Then run following two command to the console-

composer update
composer dump-autoload -o

Depredations

There are also some depredations with the release of 5.1. You should take a look at release guide section at the documentation and fix it gradually. This will be removed on Laravel 5.2 which will be released on December, 2015.

Happy Coding…

লারাভেল ডিফার্ড সার্ভিস প্রোভাইডার


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

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

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

এখন কথা হচ্ছে কিভাবে এই ডিফার্ড সার্ভিস প্রোভাইডার তৈরি করবেন? সেটিও খুব সহজ। সাধারন সার্ভিস প্রোভাইডারের মতই একটি আর্টিসান কমান্ডের মাধ্যমে আপনি এটি তৈরি করতে পারবেন। এর জন্য টার্মিনালে নিচের কমান্ডটি লিখুন-

php artisan make:provider TestServiceProvider

এর ফলে আপনার অ্যাপ্লিকেশনের app/Providers ফোল্ডারের মধ্যে একটি নতুন ফাইল তৈরি হবে TestServiceProvider.php নামে। এটি দেখতে হবে এরকম-

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class TestServiceProvider extends ServiceProvider {

	/**
	 * Bootstrap the application services.
	 *
	 * @return void
	 */
	public function boot()
	{
		//
	}

	/**
	 * Register the application services.
	 *
	 * @return void
	 */
	public function register()
	{
		//
	}

}

এই ক্লাসে আপনি যদি একটি প্রটেক্টেড প্রপার্টি তৈরি করেন $defer নামে এবং সেটির ভ্যালু ট্রুু করে দেন, তাহলে সেটিই ডিফার্ড সার্ভিস প্রোভাইডার হিসেবে কাজ করবে।

protected $defer = true;

এছাড়া এই সার্ভিস প্রভাইডের বাকি কোড সাধারন সার্ভিস প্রোভাইডারের মত করেই লিখতে হবে।

লারাভেল সিম্পল টু-ডু লিস্ট


আমার বইটা প্রকাশিত হবার পর থেকেই অনেকের কাছ থেকেই একটা অনুরোধ পেয়েছি। সেটা হচ্ছে আমার বইয়ে একটা ডেমো অ্যাপের দরকার ছিল, কিন্তু সেটা দেয়া হয় নি। তাই সবার অনুরোধ রাখতে আমি একটা সিম্পল টু-ডু অ্যাপ তৈরি করেছি। এই অ্যাপটি তৈরি করতে আমি ব্যবহার করেছি লারাভেল ফ্রেমওয়ার্ক ৫.১ ভার্সন এবং মাইসিক্যুয়েল।

এই অ্যাপটির কোড পাবেন গিটহাবে। এখানে অথেনটিকেশন, সিম্পল CRUD(Create, Read, Update, Delete) অপারেশন, রিসোর্সফুল রাউটিং, ফরম মডেল বাইন্ডিং, ফরম রিকোয়েস্ট, ফ্ল্যাশ ম্যাসেজ, পেজিনেশন সহ কিভাবে আপনি আপনার কোড গুছিয়ে লিখতে পারবেন, সে ব্যাপারে আলোকপাত করা হয়েছে।

ল্যান্ডিং পেজ

ল্যান্ডিং পেজ

sign-in-page

সাইন ইন পেজ

register-page

রেজিস্ট্রেশন পেজ

todo-list-page

টু-ডু লিস্ট পেজ

new-todo-create-page

নতুন টু-ডু তৈরির পেজ

user-profile-page

ইউজার প্রোফাইল পেজ

অ্যাপটি আপনার পিসিতে রান করতে হলে প্রথমেই গিটহাবে রিপোজিটরিটি ফর্ক করুন, তারপর ক্লোন করতে নিচের কমান্ডটি দিন-

git clone https://github.com/milon521/laravel-todo.git

এরপর ঐ ডিরেক্টরিতে প্রবেশ করুন নিচের কমান্ডটির মাধ্যমে-

cd laravel-todo

এরপর .env ফাইলটি তৈরি করুন নিচের কমান্ডটির মাধ্যমে-

cp .env.example .env

এবার .env ফাইলে আপনার প্রয়োজনীয় পরিবর্তন করে নিন। শুধুমাত্র DB_USERNAME এবং DB_PASSWORD এই দুইটি ফিল্ড পরিবর্তন করলেই হয়ে যাওয়ার কথা। তারপর আপনি নতুন একটি ডেটাবেজ তৈরি করুন todos নামে।

এরপর আপনি আপনার প্রয়োজনীয় ডিপেন্ডেন্সি ডাউনলোড করুন নিচের কমান্ডটির মাধ্যমে-

composer update

এবার আপনি নিচের কমান্ডটির মাধ্যমে আপনার ডেটাবেজ মাইগ্রেশন করে নিন-

php artisan migrate

সবশেষে আপনি storage ফোল্ডারের রাইট পারমিশন দেন এভাবে-

sudo chmod 777 -R /storage

ব্যাস হয়ে গেছে। এবার প্রজেক্টটি রান করতে টার্মিনালে লিখুন-

php artisan serve

এবার আপনি আপনার ব্রাউজারে ‌http://localhost:8000‌ ইউআরএলে গেলে প্রজেক্টটি দেখতে পারবেন।

আপনারা যদি চান তাহলে আমি কিভাবে প্রজেক্টি তৈরি করলাম সেটি স্টেপ বাই স্টেপ লিখবো। সেক্ষেত্রে আমাকে আপনাদের ব্যাপারটি জানাতে হবে।