Laravel Framework Basics পর্ব-১৪: Laravel URL Helper

Laravel URL Generation
Laravel URL Helper

Laravel URL helper গুলো দিয়ে ল্যারাভেল দিয়ে প্রজেক্টে প্রয়োজনীয় URL তৈরি করতে ব্যবহার করা হয়। সেই helper গুলো তখনি কাজে আসে যখন আমরা আমাদের templates এবং responses API-তে লিঙ্কগুলি তৈরি করি, আমাদের project বা application এর এক পেজ থেকে অন্য পেজে redirect responses তৈরি করার সময়ও ব্যবহৃত হয়। Laravel URL helper গুলো আমাদের অ্যাপ্লিকেশনে ইচ্ছামত URL তৈরি করতে ব্যবহার করা যেতে পারে, লারাভেল দিয়ে আপনি ইচ্ছামত URL জেনারেট করতে পারেন। আর এই স্বয়ংক্রিয়ভাবে http বা https এর মতো স্কিম ব্যবহার করবে। এছাড়াও এটি আমাদের অ্যাপ্লিকেশন থেকে current request পরিচালনা করবে।

Mastering Laravel with ReactJS Course

কিছু পূর্ব প্রস্তুতি :

Laravel Migration Artisan Command ব্যবহার করে Table তৈরি :

যেহেতু আমরা কিছু প্রাকটিক্যাল ব্যবহার দেখবো , এর জন্য আমরা এখন ডেটাবেস এর প্রয়োজনীয় কিছু প্রস্তুতি বা সেটআপ করে রাখব। চলুন শুরু করা যাক।

প্রথমে নিম্নোক্ত Migration Command এর মাধ্যমে আপনার Database এর জন্য একটি posts table এবং একটি comments table এর Migration File তৈরি করে ফেলুন :

php artisan make:migration create_posts_table   
php artisan make:migration create_comments_table   

এবার আপনার ডেটাবেসে posts টেবিল এবং তার স্ট্রাকচার তৈরির জন্য create_posts_table.php ফাইলে নিচের মতো করে আপডেট করে নিন :

<?php

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

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

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

একইভাবে আপনার ডেটাবেসে comments টেবিল এবং তার স্ট্রাকচার তৈরির জন্য create_comments_table.php ফাইলে নিচের মতো করে আপডেট করে নিন :

<?php

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

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->id();
            $table->foreignId('post_id')->constrained('posts');
            $table->string("comment");
            $table->timestamps();
        });
    }

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

এবার নিম্নোক্ত Laravel Migration Artisan Command ব্যবহার করে Table দুটি তৈরি করে ফেলুন :

php artisan migrate 

এখন আপনার posts table এবং comments table হবে নিম্নরূপ:

Laravel Posts Table
Laravel Posts Table
Laravel Comments Table
Laravel Comments Table

Laravel Artisan Command ব্যবহার করে Model তৈরি :

এবার আমরা যেহেতু posts table এর সাথে comments table এর One To Many রিলেশনশিপ করব। তার জন্য প্রথমে আমরা নিম্নোক্ত কম্যান্ড এর মাধ্যমে একটি Post Model এবং একটি Comment Model তৈরি করে ফেলব:

php artisan make:model Post
php artisan make:model Comment

এবার আপনার App/Models/Post.php ফাইলে নিম্নোক্ত কোড দিয়ে আপডেট করে নিন।

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    public function comment()
    {
        return $this->hasMany(Comment::class);
    }
}

ব্যাখ্যা: এখানে আমরা একটি Post এর একাধিক comment থাকবে তার জন্য আমরা comment ফাঙ্কশনের মধ্যে hasMany দিয়ে Comment Model কে যুক্ত করে দিয়েছি।

একইভাবে এবার আপনার App/Models/Comment.php ফাইলে নিম্নোক্ত কোড দিয়ে আপডেট করে নিন।

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    use HasFactory;

    public function post()
    {
        return $this->belongsTo(Post::class);
    }
}

ব্যাখ্যা: এখানে Comment Model টি যেহেতু posts Table এর id কে foreign key হিসেবে ব্যবহার করবে তার জন্য আমরা post ফাঙ্কশনের মধ্যে belongsTo দিয়ে Post Model কে যুক্ত করে দিয়েছি।

Laravel Artisan Command ব্যবহার করে Seeder তৈরি :

এবার আমরা Posts Table এ কিছু Dummy Data Insert করব। আর এই কাজটি আমরা Laravel Seeder ব্যবহার করে করব। Posts Table এ Dummy Data Insert এর জন্য নিম্নোক্ত Artisan Command ব্যবহার করে একটি postsTableSeeder ফাইল তৈরি করে ফেলুন :

php artisan make:seeder postsTableSeeder

এবার আপনার database/seeders/postsTableSeeder.php ফাইলে নিচের মতো করে আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
use Illuminate\Support\Facades\DB;

class postsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $faker = Faker::create();
        $posts=[
            [
                'title' => $faker->sentence,
                'content' => $faker->text($maxNbChars = 300),
                'created_at' => NOW(),
                'updated_at' => NOW()
            ],
            [
                'title' => $faker->sentence,
                'content' => $faker->text($maxNbChars = 300),
                'created_at' => NOW(),
                'updated_at' => NOW()
            ],
            [
                'title' => $faker->sentence,
                'content' => $faker->text($maxNbChars = 300),
                'created_at' => NOW(),
                'updated_at' => NOW()
            ],
            [
                'title' => $faker->sentence,
                'content' => $faker->text($maxNbChars = 300),
                'created_at' => NOW(),
                'updated_at' => NOW()
            ],
            [
                'title' => $faker->sentence,
                'content' => $faker->text($maxNbChars = 300),
                'created_at' => NOW(),
                'updated_at' => NOW()
            ],
           ];
             
             DB::table('posts')->insert($posts);
    }
}

একইভাবে আমরা Laravel Seeder ব্যবহার করে comments Table এ কিছু Dummy Data Insert করব। comments Table এ Dummy Data Insert এর জন্য নিম্নোক্ত Artisan Command ব্যবহার করে একটি commentsTableSeeder ফাইল তৈরি করে ফেলুন :

php artisan make:seeder commentsTableSeeder

এবার আপনার database/seeders/commentsTableSeeder.php ফাইলে নিচের মতো করে আপডেট করে নিন :

<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Faker\Factory as Faker;
use Illuminate\Support\Facades\DB;
class commentsTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $faker = Faker::create();
        $comments=[
        [
            'post_id' => 2,
        	'comment' => $faker->sentence,
        	'created_at' => NOW(),
        	'updated_at' => NOW()
        ],
        [
            'post_id' => 1,
        	'comment' => $faker->sentence,
        	'created_at' => NOW(),
        	'updated_at' => NOW()
        ],
        [
            'post_id' => 2,
        	'comment' => $faker->sentence,
        	'created_at' => NOW(),
        	'updated_at' => NOW()
        ],
        [
            'post_id' => 3,
        	'comment' => $faker->sentence,
        	'created_at' => NOW(),
        	'updated_at' => NOW()
        ],
        [
            'post_id' => 1,
        	'comment' => $faker->sentence,
        	'created_at' => NOW(),
        	'updated_at' => NOW()
        ],
       ];
         
         DB::table('comments')->insert($comments);
    	
    }
}

database.seeders/DatabaseSeeder.php class ফাইলকে নিচের মতো করে আপডেট করে নিন :

<?php

namespace Database\Seeders;

// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
            PostsTableSeeder::class,
            CommentsTableSeeder::class,
        ]);
    }
}

মোটামুটি সব কাজ শেষ , এখন আমরা নিম্নোক্ত আর্টিসান কম্যান্ড এর মাধ্যমে dummy Data গুলো Insert করব।

php artisan db:seed

এখন আপনার posts table এবং comments table এ নিম্নোক্তভাবে ডেটা গুলো দেখতে পাবেন :

Laravel Posts Table with Data
Laravel Comments Table with Data
Laravel Comments Table with Data

এবার আমরা url helper এর বাকি উদাহরণ গুলো প্র্যাক্টিস করব:

Mastering Laravel with ReactJS Course

Generating URLs in Laravel

আপনার Laravel অ্যাপ্লিকেশনের জন্য ইচ্ছা মতো URLs গুলো তৈরি করতে Laravel url helper টি ব্যবহার করতে পারেন । জেনারেটেড URL টি স্বয়ংক্রিয়ভাবে (HTTP বা HTTPS) প্রটোকল ব্যবহার করবে এবং অ্যাপ্লিকেশন দ্বারা পরিচালিত কারেন্ট রিকোয়েস্ট থেকে হোস্ট করবে।

ব্যাপারটি বুঝার জন্য আপনার route ফাইল web.php তে নিম্নোক্ত কোড গুলো লিখে ফেলুন :

Route::get('/test-url', function () {
    $post = App\Models\Post::find(1);
 
    echo url("/posts/{$post->id}");
});

এবার http://localhost:8000/test-url আপনার ব্রাউজারে লিখে এন্টার দিন , ঠিক নিচের মতো আপনি একটি জেনারেটেড URL দেখতে পাবেন।

Laravel Generate URL with URL Helper
Laravel Generate URL with URL Helper

Accessing The Current Laravel URL

যদি Laravel url helper কে কোনো path প্রদান করা না হয়, তাহলে একটি Illuminate\Routing\UrlGenerator instance প্রদান করে, যা আপনাকে current URL সম্পর্কে তথ্য নেওয়ার অনুমতি দেয়:

ব্যাপারটি বুঝার জন্য আপনার route ফাইল web.php তে test-url এর মধ্যে নিম্নোক্ত কোড গুলো যুক্ত করে দিন :

Route::get('/test-url', function () {
    $post = App\Models\Post::find(1);
 
    echo url("/posts/{$post->id}");

    // Get the current URL without the query string...
    echo "<br>Current URL: ".url()->current();
 
    // Get the current URL including the query string...
    echo "<br>Current Full URL: ".url()->full();
 
    // Get the full URL for the previous request...
    echo "<br>Previous Full URL: ".url()->previous();
});

এবার http://localhost:8000/test-url?name=Masud%20Alam&age=38 আপনার ব্রাউজারে লিখে এন্টার দিন , ঠিক নিচের মতো আপনি একটি জেনারেটেড URL দেখতে পাবেন।

Accessing The Current URL
Accessing The Current URL

তবে এই Laravel url helper methods গুলির প্রত্যেকটি URL facade এর মাধ্যমেও আপনি চাইলে এক্সেস করতে পারেন:

use Illuminate\Support\Facades\URL;

Route::get('/test-url', function () {

    // Get the current URL without the query string...
    echo "<br>Current URL: ".URL::current();
 
    // Get the current URL including the query string...
    echo "<br>Current Full URL: ".URL::full();
 
    // Get the full URL for the previous request...
    echo "<br>Previous Full URL: ".URL::previous();
});

URLs For Named Routes

route helper গুলোকে আপনি চাইলে named route URL তৈরি করতে ব্যবহার করতে পারেন। named route গুলি আপনাকে route এ ডিফাইন করার actual URL-এর সাথে মিলিত না হয়ে নতুন URLতৈরি করার সুযোগ দেয়। তাই, যদি route এর URL পরিবর্তিত হয়, তাহলে URL ফাংশনে আপনার কলগুলিতে কোনো পরিবর্তন করার দরকার নেই৷ উদাহরণস্বরূপ, মনে করুন যে আপনার অ্যাপ্লিকেশনটিতে নিম্নলিখিতগুলির মতো ডিফাইন করা একটি named route রয়েছে:

Route::get('/post/{post}', function (App\Models\Post $post) {
    dd($post);
})->name('post.show');

এই route এ একটি URL তৈরি করতে, আপনি নিচের মতো করে route helper কে যেকোনো Menu তে, Form এর action এ অথবা redirect এর কাজে ব্যবহার করতে পারেন। :

Route::get('/go-another',function(){
    return redirect(route('post.show', ['post' => 3]));
});

এবার আপনার ব্রাউজারে http://localhost:8000/go-another লিখে এন্টার দিন , ঠিক নিচের মতো আমাদের পূর্বে তৈরি Named Route post.show এবার তার প্যারামিটার সহ redirect হয়ে যাবে।

Laravel URL named Route redirection
Laravel URL named Route redirection

এছাড়াও, আপনি চাইলে route helper এ একাধিক প্যারামিটার সহ route এর URL তৈরি করতে ব্যবহার করতে পারেন:

Route::get('/post/{post}/comment/{comment}', function (App\Models\Post $post, App\Models\Comment $comment) {
    dd($comment);
})->name('comment.show');

এখন আমরা comment.show url কে নিচের মতো করে যেকোনো জায়গায় ব্যবহার করতে পারি :

Route::get('/get-comment',function(){
    return redirect(route('comment.show', ['post' => 1, 'comment' => 3]));
});

এবার আপনার ব্রাউজারে http://localhost:8000/get-comment লিখে এন্টার দিন , ঠিক নিচের মতো আমাদের পূর্বে তৈরি Named Route comment.show এবার তার প্যারামিটার সহ redirect হয়ে যাবে।

redirect named route url with multiple parameter
redirect named route url with multiple parameter

এছাড়াও আপনি চাইলে route এ ডিফাইন করা হয়নি এমন যেকোনো অতিরিক্ত array element পাঠাতে পারেন। সে ক্ষেত্রে অতিরিক্ত array element টি URL এর query string হিসেবে যোগ করা হবে:

Route::get('/get-comment',function(){
    return redirect(route('comment.show', ['post' => 1, 'comment' => 3 ,'search'=>'rocket']));
});
Named Route URL with Extra Parameter
Named Route URL with Extra Parameter

Eloquent Models

আমরা প্রায়শই Eloquent মডেলের route key (সাধারণত primary key) ব্যবহার করে URL গুলো তৈরি করি । আর , আমরা চাইলে প্যারামিটার মান হিসাবে Eloquent মডেল পাস করতে পারি :

Route::get('/post/{post?}', function (App\Models\Post $post) {
    dd($post);
})->name('post.show');


Route::get('/get-post',function(){
   $post=App\Models\Post::all();
    return redirect(route('post.show',["post"=>$post[1]]));
});

Signed URLs

Laravel Signed URL সুবিধা ব্যবহার করে আমরা আমাদের public Url গুলোকে সুরক্ষা প্রদান করতে পারি। আর এই কাজটি লারাভেল Url এ প্যারামিটার হিসেবে একটি গোপন টোকেন পাঠানোর মাধ্যমে করে থাকে।

এটি ব্যবহারের মাধ্যমে আমার ইউজার ইমেইল ভেরিফিকেশন লিংক বা আনসাবস্ক্রাইব লিংক পাঠানোর কাজ গুলি নিরাপত্তার সাথে করতে পারি,এ ছাড়াও আরো বহু কাজে আমরা Laravel Signed URL সুবিধা ব্যবহার করতে পারি । এতে বড় সুবিধা হচ্ছে, আমাদেরকে তৃতীয় কোনো ব্যক্তি বা আমাদের গ্রাহকদের যেকোনো Url প্রদান করার পর উক্ত ব্যক্তি বা আমাদের গ্রাহক আমাদের অ্যাপ্লিকেশনে তারা নিজেদেরকে authenticate করতে হবে না। আরো ভালো ভাবে বুঝার জন্য নিচের ছবিটি লক্ষ্য করুন।

Laravel Signed Url Example
Laravel Signed Url Example

তো চলুন প্রথমে ইউজারদের জন্য একটি unsubscribe route তৈরি করা যাক:

use Illuminate\Http\Request;

Route::get('/unsubscribe/{user}', function (Request $request) {
    if (! $request->hasValidSignature()) {
        abort(401);
    }
 return "Your unsubscribe Success!"; // You can add your DB Update Query here
})->name('unsubscribe');

ব্যাখ্যা: এখানে if condition এর মধ্যে অবস্থিত $request->hasValidSignature() দিয়ে আমরা মূলতঃ আমাদের সার্ভারে আগত URL টি একটি valid signature যুক্ত কিনা তা চেক করেছি। যদি valid signature না হয় , তাহলে abort() Method একটি 401 Error Throw করবে। অন্যথায় আমরা পরবর্তী Process গুলো করব। এছাড়া লাইন নম্বর ৮ এ আমরা Named Route হিসেবে unsubscribe নামকে ডিফাইন করেছি। যাকে পরবর্তীতে আমরা Signed URL হিসেবে ব্যবহার করব।

তো চলুন একটি signedRoute তৈরি করা যাক। আর এটি তৈরি করতে আমাদের URL facade টি ব্যবহার করতে হবে।

use Illuminate\Support\Facades\URL;
Route::get('/unsubscribe-me',function(){
    return "<a href=".URL::signedRoute('unsubscribe', ['user' => 1])."> Click for Unsubscribe</a>";
});

এখন যদি আপনি http://localhost:8000/unsubscribe-me তে হিট করেন এবং “Click for Unsubscribe” নামে একটি হাইপার লিংক দেখতে পাবেন। যার পিছনে একটি গোপন টোকেন লুকায়িত আছে:

Laravel Signed Url with Hidden Token
Laravel Signed Url with Hidden Token

এখন যদি আপনি উক্ত টোকেন সহ Url এ হিট করেন বা লিংকে ক্লিক করেন , তাহলে আপনাকে “Your unsubscribe Success!” এই মেসেজটি প্রদর্শন করবে। অন্যথায় আপনাকে নিচের মতো 401 error দেখাবে।

Try to access without Signed URL in Laravel
Try to access without Signed URL in Laravel

এছাড়াও আপনি চাইলে একটি নির্দিষ্ট টাইমের মধ্যে যেন লিংক টি expired হয়ে যায় ,বা লিঙ্কটির যেন কোনো কার্যকারিতা না থাকে , তা নির্ধারণ করে দিতে পারেন। এক্ষেত্রে আপনাকে URL::signedRoute এর পরিবর্তে URL::temporarySignedRoute method টি ব্যবহার করতে হবে। এবং now()->addMinutes মেথডে মিনিট আকারে একটি টাইম দিয়ে দিতে হবে। যখন Laravel একটি temporary signed route URL যাচাই করে, তখন এটি নিশ্চিত করবে যে signed URL-এ এনকোড করা টাইমের মধ্যে request পাঠিয়েছে কি না :

Route::get('/unsubscribe-me',function(){
    return "<a href=".URL::temporarySignedRoute(
        'unsubscribe', now()->addMinutes(30), ['user' => 1])."> Click for Unsubscribe</a>";
});

তবে আপনি চাইলে now()->addMinutes মেথডের পরিবর্তে now()->addSeconds বা now()->addHour মেথডও ব্যবহার করতে পারেন:

Route::get('/unsubscribe-me',function(){
    return "<a href=".URL::temporarySignedRoute(
        'unsubscribe', now()->addSeconds(10), ['user' => 1])."> Click for Unsubscribe</a>";
});

তবে আপনি চাইলে $request->hasValidSignature() মেথডের পরিবর্তে Illuminate\Routing\Middleware\ValidateSignature middleware ব্যবহার করতে পারেন। আর এর জন্য আপনাকে প্রথমে App\Http\Kernel.php তে routeMiddleware array এর মধ্যে ValidateSignature middleware টি রেজিস্টার ইতিমধ্যে রেজিস্টার করা আছে কিনা , সেটা দেখতে হবে। আর না থাকলে রেজিস্টার করে নিতে হবে।

Laravel Validate Signature Middleware
Laravel Validate Signature Middleware

unsubscribe route এর Named Route এর পর নিচের মতো করে signed Middleware টি যুক্ত করে দিতে হবে:

Route::get('/unsubscribe/{user}', function (Request $request) {
    return "Your unsubscribe Success!"; // You can add your DB Update Query here
})->name('unsubscribe')->middleware('signed');

এখন যদি আপনি Valid Token ছাড়া URL টিতে এক্সেস করার চেষ্টা করেন, তাহলে নিম্নক্ত ইরর দেখতে পাবেন:

Laravel URL Signature Validation using Middleware
Laravel URL Signature Validation using Middleware

এছাড়াও আপনি চাইলে Url এর কিছু প্যারামিটারকে রেস্ট্রিকশন দিতে পারেন। আর এর জন্য আপনাকে hasValidSignatureWhileIgnoring মেথডটি ব্যবহার করতে হবে।

Route::get('/unsubscribe/{user}', function (Request $request) {
    if (!$request->hasValidSignatureWhileIgnoring(['cart', 'order'])) {
        abort(401);
    }
 return "Your unsubscribe Success!"; // You can add your DB Update Query here
})->name('unsubscribe');

এখন যদি আপনি নিম্নোক্ত route টি রান করেন, এবং Unsubscribe Button এ ক্লিক করেন , তাহলে আপনার Route টি UNAUTHORIZED হয়ে যাবে। কেননা উক্ত route এ প্যারামিটার হিসেবে cart শব্দটি রয়েছে।

Route::get('/unsubscribe',function(){
    return "<a href=".URL::signedRoute('unsubscribe', ['user' =>'masud','cart'])."> Click for Unsubscribe</a>";
});

Responding To Invalid Signed Routes

যখন কেউ একটি signed URL এ ভিজিট করে যার মেয়াদ ইতিমধ্যে শেষ হয়ে গেছে, তখন তারা 403 HTTP স্ট্যাটাস কোড সহ একটি জেনেরিক Error Page পেয়ে থাকে । তবে , আপনি চাইলে আপনার App\Exceptions\Handler.php এর মধ্যে InvalidSignatureException exception handler টি ব্যবহার করে register() Function এর মধ্যে একটি কাস্টম “renderable” closer ডিফাইন করতে পারেন এবং একটি কাস্টমাইজ পেজ প্রদর্শন করতে পারেন। এই closure টি আপনাকে একটি HTTP response প্রদান করবে। আপনার register function টি হবে নিম্নরুপঃ

public function register()
{
    $this->renderable(function (InvalidSignatureException $e) {
        return response()->view('error.link-expired', [], 403);
    });
}

Note: তবে অবশ্যই Handler ক্লাস টি Declare করার পূর্বে নিম্নোক্ত InvalidSignatureException এর Namespace টি ব্যবহার করতে হবে।

use Illuminate\Routing\Exceptions\InvalidSignatureException;

এবার আপনার resources\views\error\link-expired.blade.php ফাইলে নিম্নোক্ত ডিজাইন কোড গুলো যুক্ত করে দিন :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>403 Page Has Expired</title>
    <style>
body{
    width:400px;
    margin:0 auto;
}
.page_403{ padding:40px 0; background:#fff; font-family: 'Arvo', serif;
}

.page_403  img{ width:100%;}

.four_zero_four_bg{
 
 background-image: url(https://cdn.dribbble.com/users/285475/screenshots/2083086/dribbble_1.gif);
    height: 400px;
    background-position: center;
    background-repeat: no-repeat;
 }
 
 
 .four_zero_three_bg h1{
 font-size:80px;
 }
 
  .four_zero_four_bg h3{
			 font-size:80px;
			 }
			 
			 .link_403{			 
	color: #fff!important;
    padding: 10px 20px;
    background: #39ac31;
    margin: 20px 0;
    display: inline-block;}
	.contant_box_403{ margin-top:-50px;}
    </style>
</head>
<body>
<section class="page_403">
	<div class="container">
		<div class="row">	
		<div class="col-sm-12 ">
		<div class="col-sm-10 col-sm-offset-1  text-center">
		<div class="four_zero_three_bg">
			<h1 class="text-center ">403</h1>
		
		
		</div>
		
		<div class="contant_box_403">
		<h3 class="h2">
		Look like your page has expired
		</h3>
		
		<p>the page you are looking has expired!</p>
		
		<a href="" class="link_403">Go to Home</a>
	</div>
		</div>
		</div>
		</div>
	</div>
</section>
</body>
</html>

Mastering Laravel with ReactJS Course

এখন আপনার যেকোনো Signed URL লিংক expired হয়ে গেলে নিচেরমত কাস্টম এরর প্রদর্শন করবে।

Signed URL Link Expired Error Page
Signed URL Link Expired Error Page

URLs For Controller Actions

আপনি চাইলে action function ব্যবহার করে controller action এর জন্য একটি URL তৈরি এবং ব্যবহার করতে পারেন।

চলুন ব্যাপারটা বুঝার জন্য প্রথমে নিচের মতো করে একটি PostController তৈরি করে ফেলি :

<?php

namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index($id){
        $post = Post::find($id);
        dd($post);
    }
}

এবার আমরা PostController দিয়ে একটি নির্দিষ্ট post এর বিস্তারিত পাওয়ার জন্য নিম্নোক্ত route টি লিখব :

use App\Http\Controllers\PostController;

Route::get('/getpost/{id}',[PostController::class,'index']);

এবার নিম্নোক্ত Route এ action function ব্যবহার করে PostController এর index Method এর জন্য একটি URL তৈরি করব:

Route::get('/mypost', function () {
    return redirect(action([PostController::class, 'index'],["id"=>2]));
});

Mastering Laravel with ReactJS Course

এখন যদি আপনি http://localhost:8000/mypost এ হিট করেন , তাহলে নিচের মতো আউটপুট পাবেন :

Laravel URLs For Controller Actions
Laravel URLs For Controller Actions

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply