ল্যারাভেলে ইউজার এবং অথেনটিকেশন – প্রাইভেট নোট অ্যাপ

ল্যারাভেলে অথেনটিকেশন যুক্ত করা সহজ। নতুন প্রজেক্ট তৈরি করার সময় আমাদের সাধারণত স্টার্টার কিট চুজ করতে দেয়। এই সময় আমরা লারাভেল ব্রিজ সিলেক্ট করে নিব। নিচে হার্ড ব্যবহার করে প্রজেক্ট তৈরি করার সময় ব্রিজ সিলেক্ট করার অপশনঃ

কমান্ড লাইন বা টার্মিনালেও অপশন পাওয়া যাবে। পূর্বে তৈরি কোন প্রজেক্টেও Laravel Breeze যুক্ত করতে পারব। তার জন্যঃ

composer require laravel/breeze --dev
php artisan breeze:install

ব্রিজ ইন্সটল করার পর ডেটাবেজ মাইগ্রেট করে নিব:

php artisan migrate

এরপর প্রয়োজনীয় npm প্যাকেজ গুলো ইন্সটল করে নিবঃ

npm install

ব্রিজ টেলউইন্ড সিএসস ব্যবহার করে এবং ভিট সার্ভার ব্যবহার করে এই টেলউইন্ড সিএসএস সার্ভ করে। তাই আমাদের ভিট সার্ভার রান করতে হবে। তার জন্য

npm run dev

ফাইনালি আমরা ল্যারাভেল প্রজেক্ট সার্ভ করতে পারবঃ

php artisan serve

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

এর আগে আমরা দেখেছি কিভাবে একটা নোট অ্যাপ তৈরি করা যায় ল্যারাভেলে। এবার ঐ নোট গুলো একজন ইউজারের আন্ডারে সেভ করব। ইউজার শুধু নিজের নোটই দেখতে পারবে। অন্য কারো নোট দেখতে পাবে না। আগের লেখাঃ ল্যারাভেলে একটা পূর্ণাঙ্গ CRUD অ্যাপ। এবারের প্রজেক্টের নাম দিলাম PrivateNote।

ইউজারের আন্ডারে নোট সেভ করা

আগের লেখাটি ফলো করে নোট মডেল ও অন্যান্য কোড লিখে নিতে হবে আগে। এরপর create_note_table মাইগ্রেশন ফাইলে ইউজার আইডি কলাম যোগ করিঃ $table->foreignId('user_id')->constrained()->onDelete('cascade');

  Schema::create('notes', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->string('title');
            $table->longText('note');
            $table->timestamps();
        });

এরপর ডেটাবেজ মাইগ্রেট করে নেই।

php artisan migrate:refresh

ফলে ডেটাবেজের note টেবিল user_id কলাম যোগ হবে। এখানে constrained()->onDelete(‘cascade’) এর মানে হচ্ছে যদি নির্দিষ্ট ইউজার ডিলিট হয়ে যায়, তাহলে তার সকল নোট ডিলিট হয়ে যাবে। উপরের কমান্ড রান করলে পূর্বের সব নোট ডিলেট হয়ে যাবে। নোট ডিলেট না করেও ডেটাবেজ মাইগ্রেট করা যায়। ঐটা আরেকটু কমপ্লিকেটেড হওয়ায় আপাতত এই লেখায় স্কিপ করছি।

রিলেশনশিপ সেট করা

মডেল ফাইলে রিলেশন সেট করতে হবে আমাদের।

App>Models> User.php ফাইলে নিচের মেথড যোগ করিঃ

 public function notes()
    {
        return $this->hasMany(Note::class);
    }

এর মানে হচ্ছে একজন ইউজারের আন্ডারে একের অধিক নোট থাকবে।

App>Models> Note.php ফাইলে নিচের মেথড যোগ করিঃ

     public function user()
     {
         return $this->belongsTo(User::class);
     }

এর মানে হচ্ছে একটা নোট একজন ইউজারের আন্ডারে থাকবে।

ইউজারের আন্ডারে নোট সেভ করাঃ

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

 public function store(Request $request){
        $data = $request->validate([
            'title' => ['required', 'string'],
            'note' => ['required', 'string'],
        ]);

        $user = Auth::user();

        $note = $user->notes()->create([
            'title' => $data['title'],
            'note' => $data['note'],
        ]);
}

অথেনটিকেশন ইউজার নিয়ে কাজ করার জন্য use Illuminate\Support\Facades\Auth; ফ্যাসাদ ইনক্লুড করে নিতে হবে।

শুধু মাত্র কারেন্ট ইউজারের নোট গুলো দেখানোঃ

    public function index(){        
       $notes = Note::orderBy("created_at","desc")
        ->where('user_id', Auth::id())
        ->paginate(10);
        return  view("index", ['notes'=>$notes]);
}

যেন শুধু মাত্র লগডইন ইউজার নিজের নোট গুলো দেখতে পারে এবং অন্য কেউ যেন দেখতে না পারে, তার জন্য আমাদের NoteController এর Show, Edit, Update, Delete মেথড গুলো আপডেট করতে হবে।

show মেথডঃ

   public function show(Note $note){
        if ($note->user_id !== request()->user()->id) {
            abort(403);
        }
        return view("single", ['note' => $note]);
    }

edit মেথডঃ

   public function edit(Note $note){
        if($note->user_id !== request()->user()->id){
            abort(403);
        }
        return  view("edit", ['note'=>$note]);
    }

update মেথডঃ

    public function update(Request $request, Note $note)
    {
        if($note->user_id !== request()->user()->id){
            abort(403);
        }

        $data = $request->validate([
            'title' => ['required', 'string'],
            'note' => ['required', 'string']
        ]);
        $note->Update($data);
        return to_route('note.show', $note);
    }

delete মেথডঃ

    public function destroy(Note $note)
    {
        if($note->user_id !== request()->user()->id){
            abort(403);
        }
        $note->delete();
        return to_route('note.index', $note);
    }

হয়ে গেলো একটা প্রাইভেট নোট অ্যাপ।

Leave a Reply