नियंत्रक

नई नियंत्रक फ़ाइल बनाएं 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.php में controller_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 post header cookie आदि डेटा) प्राप्त कर सकते हैं, अनुरोध देखें
  • नियंत्रक में आप संख्याएँ, स्ट्रिंग या 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

नियंत्रक जीवनचक्र

जब config/app.php में controller_reuse false हो, तो प्रत्येक अनुरोध के लिए संबंधित नियंत्रक उदाहरण दोबारा आरंभ किया जाएगा, और अनुरोध समाप्त होने के बाद नियंत्रक उदाहरण नष्ट कर दिया जाएगा, यह पारंपरिक ढांचे के कार्य प्रणाली के समान है।

जब config/app.php में controller_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 response('hello'); 
    }
}

नियंत्रक पुन: उपयोग और न किया जाने वाले के बीच अंतर

अंतर इस प्रकार है

नियंत्रक का पुन: प्रयोग नहीं करना

प्रत्येक अनुरोध एक नए नियंत्रक उदाहरण को फिर से बनाता है, और अनुरोध समाप्त होने पर उस उदाहरण को नष्ट कर देता है और मेमोरी को पुनः प्राप्त करता है। गैर-पुन: उपयोग की व्यवस्था पारंपरिक ढाँचे के समान है, जो अधिकांश डेवलपर्स की आदतों के अनुसार है। क्योंकि नियंत्रकों के बार-बार निर्माण और नष्ट होने के कारण, प्रदर्शन पुन: उपयोग नियंत्रकों की तुलना में थोड़ा कम होगा (helloworld परफॉर्मेंस परीक्षण में लगभग 10% का अनुमान है, व्यावसायिक कार्यक्षेत्र में यह अनदेखा किया जा सकता है)

नियंत्रक का पुन: उपयोग

अगर पुन: उपयोग किया जाए, तो एक प्रक्रिया केवल एक बार नियंत्रक को बनाती है, और अनुरोध समाप्त होने पर उस नियंत्रक उदाहरण को नहीं मुक्त करती है, वर्तमान प्रक्रिया की बाद की अनुरोध उस उदाहरण का पुन: उपयोग करेंगी। पुन: उपयोग नियंत्रक प्रदर्शन में सुधार करता है, लेकिन यह अधिकांश डेवलपर्स की आदतों के अनुसार नहीं है।

निम्नलिखित मामलों में नियंत्रक को पुन: उपयोग नहीं किया जा सकता है

जब अनुरोध नियंत्रक के गुणों को बदलता है, तो नियंत्रक का पुन: उपयोग नहीं किया जाना चाहिए, क्योंकि इन गुणों में परिवर्तन बाद के अनुरोधों को प्रभावित करेगा।

कुछ डेवलपर्स नियंत्रक के कुन्स्ट्रक्टर __construct() में प्रत्येक अनुरोध के लिए कुछ आरंभ करना पसंद करते हैं, तो इस स्थिति में नियंत्रक का पुन: उपयोग नहीं किया जा सकता है, क्योंकि वर्तमान प्रक्रिया के कुन्स्ट्रक्टर केवल एक बार कॉल किए जाते हैं, और यह हर अनुरोध पर कॉल नहीं किया जाता है।