লারাভেল টিউটোরিয়ালের আজকের পর্বে আমরা লারাভেলে কাস্টম ভেলিডেশন রুল কিভাবে তৈরি করা যায় তা দেখবো । অনেক সময় আমাদের এমন কিছু আউট অফ দা বক্স ভেলিডেশন করার প্রয়োজন পরে যেগুলো কিনা লারাভেলে ডিফল্টভাবে দেয়া থাকে না। ঠিক তখনই প্রয়োজন পরে কাস্টম ভেলিডেশনের । টিউটোরিয়ালটি কয়েকটি ধাপে ভাগ করা হয়েছেঃ
১ ) লোকাল সার্ভারে লারাভেল ইন্সটল ও কনফিগার করা
২ ) ডাটাবেজ কনফিগার করা
৩ ) মডেল ও মাইগ্রেশন তৈরি করা
৪ ) কন্ট্রোলার তৈরি করা
৫) রাউট তৈরি করা
৬ ) ভেলিডেশন রুল তৈরি করা
৭ ) ভেলিডেশন রুল ডিফাইন করা
৮ ) ভিউ তৈরি করা এবং ভেলিডেশন চেক করা
লোকাল সার্ভারে লারাভেল ইন্সটল ও কনফিগার করা
প্রথমেই আমরা যে কাজটি করবো সেটি হচ্ছে লোকাল সার্ভারে লারাভেল ইন্সটল করা । সেটার জন্য আমরা কম্পোজার ইউজ করবো । তবে তার আগে কম্পিউটারে কম্পোজার ইন্সটল থাকতে হবে । CMD খুলে নিচের কমান্ডটি লিখুনঃ
composer create-project laravel/laravel laravel_custom_rules
তবে যদি লারাভেল ইন্সটলার ইন্সটল করা থাকে তাহলে নিচের কমান্ড লিখেও প্রোজেক্ট তৈরি করা যেতে পারে
laravel new
laravel_custom_rules
লারাভেল ইন্সটল হয়ে গেলে CMD তে নিচের কমান্ড লিখুন
cd
laravel_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']; }
এবার
2019_03_08_171115_create_posts_table.phpdatabase/migrations/
ফাইল ওপেন করে নিচের মতো করে কোড লিখুন
<?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 !'); } } }
আমাদের কাজ মোটামুটি শেষ । এবার প্রোজেক্টটি ওপেন করে ভেলিডেশন চেক করলে আমরা দেখতে পারবো যে আমাদের ভেলিডেশন রুল কাজ করতেসে
আবার ভেলিডেশন পাস করলে পোস্ট ডাটাবেজে স্টোর হচ্ছে
তো এই ছিল আজকের আর্টিকেল লেখার উদ্দেশ্য । আশা করি পোস্টটি ভাল লাগবে আপনাদের । পুরো প্রোজেক্ট ডাউনলোড করতে পারেন গিটহাব থেকে । আগামী টিউটোরিয়ালে কথা হবে । ধন্যবাদ
Vai post e code gula erokom colorful korecen kivabe?