Mon. Aug 19th, 2019

লারাভেল Custom Validation Rules নিয়ে কাজ



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

১ ) লোকাল সার্ভারে লারাভেল ইন্সটল  ও কনফিগার করা 

২ ) ডাটাবেজ কনফিগার করা 

৩ ) মডেল ও মাইগ্রেশন তৈরি করা 

৪ ) কন্ট্রোলার তৈরি করা 

৫) রাউট  তৈরি করা

৬ ) ভেলিডেশন রুল তৈরি করা 

৭ ) ভেলিডেশন রুল ডিফাইন করা

৮ ) ভিউ তৈরি করা এবং ভেলিডেশন চেক করা

লোকাল সার্ভারে লারাভেল ইন্সটল  ও কনফিগার করা

প্রথমেই আমরা যে কাজটি করবো সেটি হচ্ছে লোকাল সার্ভারে লারাভেল ইন্সটল করা । সেটার জন্য আমরা কম্পোজার ইউজ করবো । তবে তার আগে কম্পিউটারে কম্পোজার ইন্সটল থাকতে হবে । CMD খুলে নিচের কমান্ডটি লিখুনঃ

composer create-project laravel/laravel  laravel_custom_rules



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

laravel newlaravel_custom_rules

লারাভেল ইন্সটল হয়ে গেলে CMD তে নিচের কমান্ড লিখুন

cdlaravel_custom_rules

প্রোজেক্ট ফোল্ডারে ঢুকার পরে নিচের কমান্ডটি লিখে সার্ভার চালু করুন

php artisan serve

সার্ভার সাধারণত http://localhost:8000 এই অ্যাড্রেসে চালু হয় । এইবার ব্রাউজারে এই লিঙ্ক ওপেন করলে ডিফল্ট লারাভেলের হোম পেজ দেখতে পাবেন ।

ডাটাবেজ কনফিগার করা




ডাটাবেজ কনফিগার করার আগে  app/Providers/AppServiceProvider.phpফাইলটি ওপেন করে নিচের কোডটুকু লিখুন

<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Schema;
class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Schema::defaultStringLength(191);
    }
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

এতে করে মাইগ্রেশন চালানোর সময় এরর আসবে না । এবার আপনার প্রোজেক্টের  .env ফাইলটি ওপেন করে নিচের কোডটুকু লিখে ডাটাবেজের সাথে কানেক্ট করুন

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_db_name
DB_USERNAME=db_username
DB_PASSWORD=db_password

উপরের কোডে আপনার ডাটাবেজের নাম , ইউজারনেম এবং পাসওয়ার্ড দিন । পুনরায় সার্ভার চালু করুন ।




মডেল ও মাইগ্রেশন তৈরি করা

এই স্টেপে আমরা মডেল এবং মাইগ্রেশন তৈরি করবো নিচের কমান্ডের মাধ্যমে

php artisan make:model Post -m 

এখন app/Post.php ফাইল ওপেন করে নিচের মতো করে কোড লিখুন

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
    protected $fillable=['title','category','description'];
}

এবার database/migrations/2019_03_08_171115_create_posts_table.php ফাইল ওপেন করে নিচের মতো করে কোড লিখুন

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->string('category');
            $table->text('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

ফাইল সেভ করে নিচের কমান্ড লিখে ডাটাবেজ মাইগ্রেট করুন

php artisan migrate

পিএইচপি মাইএডমিন থেকে ডাটাবেজ ওপেন করে দেখতে পাবেন যে টেবিল গুলো ক্রিয়েট হয়েছে ।




কন্ট্রোলার তৈরি করা

এই স্টেপে আমাদের কাজ হচ্ছে কন্ট্রোলার তৈরি করা । নিচের কমান্ডটি লিখে কন্ট্রোলার তৈরি করা হয়

php artisan make:controller PostController 

কমান্ডটি লিখার ফলে app/Http/Controllers/PostController.php নামে একটি কন্ট্রোলার তৈরি হয়ে গেলো ।

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;
use Validator;
class PostController extends Controller
{
    
}

কন্ট্রোলারের কোড দেখতে অনেকটা উপরের কোডের মতো হবে । তবে php artisan make:controller -r  PostController  এই কমান্ডটি ইউজ করলে কন্ট্রোলার অনেকটা নিচের মতো হবে ।

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

রাউট  তৈরি করা

এই স্টেপে আমাদের কাজ হচ্ছে রাউট তৈরি করা । routes/web.phpএই ফাইলটি ওপেন করে নিচের মতো কোড লিখুন

<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/','PostController@create')->name('post.create');
Route::post('/','PostController@store')->name('post.store');

ভেলিডেশন রুল তৈরি করা

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



php artisan make:rule CheckTitle

php artisan make:rule LowerCase

প্রথমটি দিয়ে পোস্টের টাইটেল কি টাইটেল কেসে আছে কিনা সেটা চেক করবে । টাইটেল কেস মানে হচ্ছে একটা লাইনের প্রত্যেকটি ওয়ার্ডের প্রথম অক্ষর বড় হাতের হবে । দ্বিতীয়টি দিয়ে পোস্টের ক্যাটাগরি লোয়ার কেসে আছে কিনা সেটা চেক করবে । app/Rules/CheckTitle.phpফাইলটি ওপেন করলে ঠিক নিচের মতো দেখাবে

<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class CheckTitle implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }
    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        //
    }
}

এবং app/Rules/LowerCase.phpফাইলটি ওপেন করলে ঠিক নিচের মতো দেখাবে

<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class LowerCase implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //
    }
    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        //
    }
}



ভেলিডেশন রুল ডিফাইন করা

এখানে passes মেথডে ভেলিডেশন লজিক লিখতে হবে এবং message মেথডে এরর মেসেজ লিখতে হবে। এখন app/Rules/CheckTitle.phpফাইলটি ওপেন করে passes মেথডে নিচের মতো করে কোড লিখি

return ucwords($value)===$value;

এবং message মেথডে নিচের মতো করে কোড লিখি

return 'The :attribute must be a title.';

একইভাবে app/Rules/LowerCase.phpফাইলটি ওপেন করে passes মেথডে নিচের মতো করে কোড লিখি

return strtolower($value)===$value;

এবং message মেথডে নিচের মতো করে কোড লিখি

return 'The :attribute must be lower case !';

app/Rules/LowerCase.php ফাইনাল কোড

<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class LowerCase implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return strtolower($value)===$value;
    }
    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be lower case !';
    }
}

app/Rules/CheckTitle.php ফাইনাল কোড

<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class CheckTitle implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return ucwords($value)===$value;
    }
    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be a title.';
    }
}

ভিউ তৈরি করা

এই স্টেপে আমাদের কাজ হচ্ছে ভিউ তৈরি করা । resources/views ফোল্ডারে ঢুকে create_post.blade.php ফাইলটি তৈরি করুন এবং নিচের কোডগুলো লিখুন

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
    <title>Create Post | Laravel Custom Validation Rule</title>
  </head>
  <body>
    <div class="container mt-5">
       <div class="row justify-content-center">
          <div class="col-5">
              <h3 class="text-center text-muted">Create New Post</h3>
              @if(Session::has('message'))
                <div class="alert alert-success" role="alert">
                   {{ Session::get('message') }}
                </div>
              @endif
              <div class="card mt-5">
                  <div class="card-body">
                     <form action="{{ route('post.store') }}" method="POST">
                        @csrf
                        <div class="form-group">
                           <label for="">Title</label>
                           <input type="text" class="form-control {{ ($errors->has('title'))?'is-invalid':'' }}" name="title" value="{{ old('title') }}" placeholder="Enter title...">
                           @if($errors->has('title'))
                              <span class="text-danger">{{ $errors->first('title') }}</span>
                           @endif
                        </div>
                        <div class="form-group">
                           <label for="">Category</label>
                           <input type="text" class="form-control {{ ($errors->has('category'))?'is-invalid':'' }}" name="category" value="{{ old('category') }}" placeholder="Enter category...">
                           @if($errors->has('category'))
                              <span class="text-danger">{{ $errors->first('category') }}</span>
                           @endif
                        </div>
                        <div class="form-group">
                           <label for="">Description</label>
                           <textarea class="form-control {{ ($errors->has('description'))?'is-invalid':'' }}" name="description" value="{{ old('description') }}" placeholder="Enter description..."></textarea>
                           @if($errors->has('description'))
                              <span class="text-danger">{{ $errors->first('description') }}</span>
                           @endif
                        </div>
                        <button type="submit" class="btn btn-success">Create</button>
                     </form>
                  </div>
              </div>
          </div>
       </div>
    </div>
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
  </body>
</html>

এবার কন্ট্রোলার ওপেন করে নিচের মতো মেথড লিখতে হবে

// show create post view
    public function create(){
        return view('create_post');
    }

এই মেথডটি মূলত রাউটের সাথে ভিউকে বাইন্ড করবে । ঠিক একইভাবে আরেকটি মেথড তৈরি করতে হবে পোস্ট ডাটাবেজে স্টোর করার জন্য এবং এই মেথডেই আমরা আমাদের ভেলিডেশন চেক করাবো । তার আগে আমাদের তৈরি করা ভেলিডেশন রুল ক্লাসগুলোকে কন্ট্রোলারে ইউজ করে নিতে হবে নিচের মতো করে।




use App\Rules\CheckTitle;
use App\Rules\LowerCase;

এবার মেথডটি কন্ট্রোলারে অ্যাড করুন নিচের মতো কোড লিখে

// store post into the database
    public function store(Request $request){
        $validators=Validator::make($request->all(),[
            'title'=>['required',new CheckTitle()],
            'category'=>['required',new LowerCase()],
            'description'=>'required'
        ]);
        if($validators->fails()){
            return redirect()->route('post.create')->withErrors($validators)->withInput();
        }else{
            $post=new Post();
            $post->title=$request->title;
            $post->category=$request->category;
            $post->description=$request->description;
            $post->save();
            return redirect()->route('post.create')->with('message','Post created successfully !');
        }
    }



ফাইনাল কন্ট্রোলার কোড

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Post;
use Validator;
use App\Rules\CheckTitle;
use App\Rules\LowerCase;
class PostController extends Controller
{
    // show create post view
    public function create(){
        return view('create_post');
    }
    // store post into the database
    public function store(Request $request){
        $validators=Validator::make($request->all(),[
            'title'=>['required',new CheckTitle()],
            'category'=>['required',new LowerCase()],
            'description'=>'required'
        ]);
        if($validators->fails()){
            return redirect()->route('post.create')->withErrors($validators)->withInput();
        }else{
            $post=new Post();
            $post->title=$request->title;
            $post->category=$request->category;
            $post->description=$request->description;
            $post->save();
            return redirect()->route('post.create')->with('message','Post created successfully !');
        }
    }
}

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

আবার ভেলিডেশন পাস করলে পোস্ট ডাটাবেজে স্টোর হচ্ছে

 

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




Comments

comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: