কন্ট্রোলার

নতুন কন্ট্রোলার ফাইল app/controller/FooController.php তৈরি করুন।

<?php
namespace app\controller;

use support\Request;

class FooController
{
    public function index(Request $request)
    {
        return response('hello index');
    }

    public function hello(Request $request)
    {
        return response('hello webman');
    }
}

যখন http://127.0.0.1:8787/foo এ প্রবেশ করা হয়, তখন পাতা hello index ফেরত দেয়।

যখন http://127.0.0.1:8787/foo/hello এ প্রবেশ করা হয়, তখন পাতা hello webman ফেরত দেয়।

অবশ্যই আপনি রাউট কনফিগারেশনের মাধ্যমে রাউট নিয়ম পরিবর্তন করতে পারেন, দেখুন রাউট

টিপ
যদি 404 ত্রুটি দেখা যায় এবং অ্যাক্সেস করতে অক্ষম হন, তবে config/app.php খুলুন, controller_suffix Controller এ সেট করুন এবং পুনরায় স্টার্ট করুন।

কন্ট্রোলার সাফিক্স

webman 1.3 সংস্করণের পর থেকে, config/app.php এ কন্ট্রোলার সাফিক্স সেটিং সমর্থন করে, যদি config/app.phpcontroller_suffix খালি '' সেট করা থাকে, তবে কন্ট্রোলারটি নিম্নরূপ রূপ নেবে

app\controller\Foo.php

<?php
namespace app\controller;

use support\Request;

class Foo
{
    public function index(Request $request)
    {
        return response('hello index');
    }

    public function hello(Request $request)
    {
        return response('hello webman');
    }
}

কন্ট্রোলার সাফিক্স Controller হিসাবে সেট করা সুপারিশ করা হয়, এটি কন্ট্রোলার এবং মডেল ক্লাস নামের সংঘর্ষ প্রতিরোধ করে এবং নিরাপত্তা বৃদ্ধি করে।

ব্যাখ্যা

  • ফ্রেমওয়ার্ক স্বয়ংক্রিয়ভাবে কন্ট্রোলারে support\Request অবজেক্ট সরবরাহ করে, এর মাধ্যমে আপনি ব্যবহারকারীর ইনপুট ডেটা (get পোস্ট হেডার কুকি ইত্যাদি ডেটা) পেতে পারেন, দেখুন অনুরোধ
  • কন্ট্রোলারে সংখ্যা, স্ট্রিং বা support\Response অবজেক্ট ফেরত দেওয়া যায়, তবে অন্যান্য ধরনের ডেটা ফেরত দেওয়া যাবে না।
  • support\Response অবজেক্টগুলি response() json() xml() jsonp() redirect() ইত্যাদি সাহায্যকারী ফাংশনের মাধ্যমে তৈরি করা যায়।

কন্ট্রোলার প্যারামিটার বাইন্ডিং

উদাহরণ

webman কন্ট্রোলার পদ্ধতি প্যারামিটারদের স্বয়ংক্রিয়ভাবে অনুরোধ প্যারামিটারগুলির সাথে বন্ধন করার জন্য সমর্থন করে, উদাহরণস্বরূপ

<?php
namespace app\controller;
use support\Response;

class UserController
{
    public function create(string $name, int $age): Response
    {
        return json(['name' => $name, 'age' => $age]);
    }
}

আপনি GET POST পদ্ধতিতে name এবং age এর মানগুলি পাঠাতে পারেন, বা রাউট প্যারামিটার ব্যবহার করে name এবং age প্যারামিটার পাঠাতে পারেন, যেমন

Route::any('/user/{name}/{age}', [app\controller\UserController::class, 'create']);

প্রাথমিকতা হল রাউট প্যারামিটার > GET > POST প্যারামিটার

ডিফল্ট মান

ধরি আমরা /user/create?name=tom এ প্রবেশ করি, আমরা নিম্নলিখিত ত্রুটি পাব

Missing input parameter age

কারণ আমরা age প্যারামিটারটি পাঠাইনি, এই সমস্যাটি সমাধান করতে প্যারামিটারগুলিতে ডিফল্ট মান সেট করতে পারেন, যেমন

<?php
namespace app\controller;
use support\Response;

class UserController
{
    public function create(string $name, int $age = 18): Response
    {
        return json(['name' => $name, 'age' => $age]);
    }
}

প্যারামিটার টাইপ

যখন আমরা /user/create?name=tom&age=not_int এ প্রবেশ করি, আমরা নিম্নলিখিত ত্রুটি পাব

টিপ
এখানে পরীক্ষার সুবিধার জন্য, আমরা সরাসরি ব্রাউজারের ঠিকানার প্যারামিটারগুলি প্রবেশ করেছি, প্রকৃত উন্নয়নে প্যারামিটারগুলি POST পদ্ধতিতে পাঠাতে হবে।

Input age must be of type int, string given

এটি কারণ গ্রহণ করা ডেটা টাইপ অনুসারে রূপান্তর করা হবে, যদি রূপান্তর করতে না পারে তবে support\exception\InputTypeException ব্যতিক্রম নিক্ষেপ করবে,
যেহেতু প্রেরিত age প্যারামিটারটি int টাইপে রূপান্তরিত হতে পারে না, তাই এইরূপ ত্রুটি পাওয়া যায়।

কাস্টম ত্রুটি

আমরা মল্টিল্যাঙ্গুয়েজ ব্যবহার করে Missing input parameter age এবং Input age must be of type int, string given এর মতো ত্রুটিগুলি কাস্টমাইজ করতে পারি, নিম্নলিখিত কমান্ডটি দেখুন

composer require symfony/translation
mkdir resource/translations/zh_CN/ -p
echo "<?php
return [
    'Input :parameter must be of type :exceptType, :actualType given' => 'ইনপুট প্যারামিটার :parameter টাইপ :exceptType হতে হবে, :actualType প্রকার দেওয়া হয়েছে',
    'Missing input parameter :parameter' => 'ইনপুট প্যারামিটার :parameter অনুপস্থিত',
];" > resource/translations/zh_CN/messages.php
php start.php restart

অন্যান্য টাইপ

webman সমর্থিত প্যারামিটার টাইপগুলির মধ্যে রয়েছে int float string bool array object ক্লাস ইনস্ট্যান্স ইত্যাদি, যেমন

<?php
namespace app\controller;
use support\Response;

class UserController
{
    public function create(string $name, int $age, float $balance, bool $vip, array $extension): Response
    {
        return json([
            'name' => $name,
            'age' => $age,
            'balance' => $balance,
            'vip' => $vip,
            'extension' => $extension,
        ]);
    }
}

যখন আমরা /user/create?name=tom&age=18&balance=100.5&vip=true&extension[foo]=bar এ প্রবেশ করি, আমরা নিম্নলিখিত ফলাফল পাব

{
  "name": "tom",
  "age": 18,
  "balance": 100.5,
  "vip": true,
  "extension": {
    "foo": "bar"
  }
}

ক্লাস ইনস্ট্যান্স

webman প্যারামিটার টাইপ হিন্ট ব্যবহার করে ক্লাস ইনস্ট্যান্স প্রেরণ করতে সমর্থন করে, উদাহরণস্বরূপ

app\service\Blog.php

<?php
namespace app\service;
class Blog
{
    private $title;
    private $content;
    public function __construct(string $title, string $content)
    {
        $this->title = $title;
        $this->content = $content;
    }
    public function get()
    {
        return [
            'title' => $this->title,
            'content' => $this->content,
        ];
    }
}

app\controller\BlogController.php

<?php
namespace app\controller;
use app\service\Blog;
use support\Response;

class BlogController
{
    public function create(Blog $blog): Response
    {
        return json($blog->get());
    }
}

যখন আমরা /blog/create?blog[title]=hello&blog[content]=world এ প্রবেশ করি, আমরা নিম্নলিখিত ফলাফল পাব

{
  "title": "hello",
  "content": "world"
}

মডেল ইনস্ট্যান্স

app\model\User.php

<?php
namespace app\model;
use support\Model;
class User extends Model
{
    protected $connection = 'mysql';
    protected $table = 'user';
    protected $primaryKey = 'id';
    public $timestamps = false;
    // এখানে পূরণ করা যাবে এমন ক্ষেত্রগুলি যুক্ত করতে হবে, যাতে ফ্রন্টএন্ড অপ্রয়োজনীয় ক্ষেত্র সম্প্রদান না করে
    protected $fillable = ['name', 'age'];
}

app\controller\UserController.php

<?php
namespace app\controller;
use app\model\User;
class UserController
{
    public function create(User $user): int
    {
        $user->save();
        return $user->id;
    }
}

যখন আমরা /user/create?user[name]=tom&user[age]=18 এ প্রবেশ করি, আমরা নিম্নরূপ ফলাফল পাব

1

কন্ট্রোলার Lifecycle

যখন config/app.phpcontroller_reuse false হয়, তখন প্রতিটি অনুরোধের জন্য সংশ্লিষ্ট কন্ট্রোলার ইনস্ট্যান্স একবারই প্রাথমিক হয়, অনুরোধ শেষ হলে কন্ট্রোলার ইনস্ট্যান্স ধ্বংস হয়ে যায়, এটি ঐতিহ্যগত ফ্রেমওয়ার্কের চলাচলের সাথে সামঞ্জস্যপূর্ণ।

যখন config/app.phpcontroller_reuse true হয়, তখন সমস্ত অনুরোধ কন্ট্রোলার ইনস্ট্যান্স পুনর্ব্যবহার করে, অর্থাৎ কন্ট্রোলার ইনস্ট্যান্স একবার নির্মিত হলে এটি মেমরিতে থাকার জন্য ধ্রুবক থাকে এবং সমস্ত অনুরোধ পুনরায় ব্যবহার করে।

মনে রাখবেন
কন্ট্রোলার পুনর্ব্যবহার খোলার সময়, অনুরোধ কন্ট্রোলারের কোনও প্রপার্টি পরিবর্তন করা উচিত নয় কারণ এই পরিবর্তনগুলি পরবর্তী অনুরোধকে প্রভাবিত করবে, যেমন

<?php
namespace app\controller;

use support\Request;

class FooController
{
    protected $model;

    public function update(Request $request, $id)
    {
        $model = $this->getModel($id);
        $model->update();
        return response('ok');
    }

    public function delete(Request $request, $id)
    {
        $model = $this->getModel($id);
        $model->delete();
        return response('ok');
    }

    protected function getModel($id)
    {
        // এই পদ্ধতিটি প্রথম অনুরোধ update?id=1 এর পরে model সংরক্ষণ করবে
        // যদি পুনরায় delete?id=2 এর জন্য অনুরোধ করা হয়, তবে 1 এর তথ্য মুছে ফেলা হবে
        if (!$this->model) {
            $this->model = Model::find($id);
        }
        return $this->model;
    }
}

টিপ
কন্ট্রোলারের __construct() কনস্ট্রাক্টরে ডেটা ফেরত দেওয়া হবে না, যেমন

<?php
namespace app\controller;

use support\Request;

class FooController
{
    public function __construct()
    {
        // কনস্ট্রাক্টরে return ডেটা কোন কার্যকারিতা নেই, ব্রাউজার এই প্রতিক্রিয়া গ্রহণ করবে না
        return response('hello'); 
    }
}

কন্ট্রোলার অদৃশ্য ও পুনর্ব্যবহার পার্থক্য

পার্থক্য নিম্নরূপ

কন্ট্রোলার অদৃশ্য

প্রতিটি অনুরোধে নতুন কন্ট্রোলার ইনস্ট্যান্স তৈরি হয়, অনুরোধ শেষ হলে ইনস্ট্যান্সটি মুক্ত হয় এবং স্মৃতি পুনরুদ্ধার হয়। অদৃশ্য কন্ট্রোলার ঐতিহ্যগত ফ্রেমওয়ার্কের মতো, বেশিরভাগ ডেভেলপারদের অভ্যাসে প্রযোজ্য। কন্ট্রোলার বারবার তৈরি ও ধ্বংস হওয়ায়, ফিচারগুলির ব্যবহার কন্ট্রোলার পুনর্ব্যবহারের চেয়ে কিছুটা কম হবে (helloworld চাপ পরীক্ষায় পারফরম্যান্স 10% কম, ব্যবসা সংযুক্ত হলে এটি প্রায় শূন্যে চলে যায়)।

কন্ট্রোলার পুনর্ব্যবহার

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

নিম্নলিখিত পরিস্থিতিতে কন্ট্রোলার পুনর্ব্যবহার ব্যবহার করা যাবে না

যখন অনুরোধ কন্ট্রোলারের প্রপার্টি পরিবর্তন করে তখন কন্ট্রোলার পুনর্ব্যবহার খোলা উচিত নয় কারণ এই প্রপার্টির পরিবর্তন ভবিষ্যতের অনুরোধগুলিকে প্রভাবিত করবে।

কিছু ডেভেলপার কন্ট্রোলারের কনস্ট্রাক্টারে __construct() তে প্রতিটি অনুরোধের জন্য কিছু শুরু করতে পছন্দ করেন, তখন কন্ট্রোলার পুনর্ব্যবহার করা যাবে না কারণ বর্তমান প্রক্রিয়ার কনস্ট্রাক্টর কেবল একবার কল করা হবে, এই কারণে প্রতিটি অনুরোধের জন্য কল হবে না।