ভিউ

webman ডিফল্টভাবে php-এর মূল সিনট্যাক্স মডেল হিসেবে ব্যবহার করে, যা opcache চালু করার পর সেরা পারফরম্যান্স প্রদান করে। php এর মূল মডেলের পাশাপাশি, webman আরও প্রদান করে Twig, Blade, think-template মডেল ইঞ্জিন।

opcache চালু করা

ভিউ ব্যবহার করার সময়, strongly建议开启 php.ini এর opcache.enable এবং opcache.enable_cli দুইটি অপশন, যাতে মডেল ইঞ্জিন সেরা পারফরম্যান্স প্রদর্শন করতে পারে।

Twig ইনস্টল করা

  1. Composer দ্বারা ইনস্টল

composer require twig/twig

  1. কনফিগারেশন পরিবর্তন করুন config/view.php
    
    <?php
    use support\view\Twig;

return [
'handler' => Twig::class
];

> **提示**
> অন্যান্য কনফিগারেশন অপশন `options` মাধ্যমে পাঠানো যেতে পারে, যেমন  

```php
return [
    'handler' => Twig::class,
    'options' => [
        'debug' => false,
        'charset' => 'utf-8'
    ]
];

Blade ইনস্টল করা

  1. Composer দ্বারা ইনস্টল
composer require psr/container ^1.1.1 webman/blade
  1. কনফিগারেশন পরিবর্তন করুন config/view.php
    
    <?php
    use support\view\Blade;

return [
'handler' => Blade::class
];


## think-template ইনস্টল করা
1. Composer দ্বারা ইনস্টল

`composer require topthink/think-template`

2. কনফিগারেশন পরিবর্তন করুন `config/view.php` এ
```php
<?php
use support\view\ThinkPHP;

return [
    'handler' => ThinkPHP::class,
];

提示
অন্যান্য কনফিগারেশন অপশন options মাধ্যমে পাঠানো যেতে পারে, যেমন

return [
    'handler' => ThinkPHP::class,
    'options' => [
        'view_suffix' => 'html',
        'tpl_begin' => '{',
        'tpl_end' => '}'
    ]
];

মূল PHP মডেল ইঞ্জিনের উদাহরণ

ফাইল তৈরি করুন app/controller/UserController.php এইভাবে

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

নতুন ফাইল তৈরি করুন app/view/user/hello.html এইভাবে

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello <?=htmlspecialchars($name)?>
</body>
</html>

Twig মডেল ইঞ্জিনের উদাহরণ

কনফিগারেশন পরিবর্তন করুন config/view.php

<?php
use support\view\Twig;

return [
    'handler' => Twig::class
];

app/controller/UserController.php এইভাবে

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

ফাইল app/view/user/hello.html এইভাবে

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{name}}
</body>
</html>

আরও তথ্যের জন্য রেফার করুন Twig

Blade মডেলের উদাহরণ

কনফিগারেশন পরিবর্তন করুন config/view.php

<?php
use support\view\Blade;

return [
    'handler' => Blade::class
];

app/controller/UserController.php এইভাবে

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

ফাইল app/view/user/hello.blade.php এইভাবে

注意blade模版后缀名为.blade.php

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {{$name}}
</body>
</html>

আরও তথ্যের জন্য রেফার করুন Blade

ThinkPHP মডেলের উদাহরণ

কনফিগারেশন পরিবর্তন করুন config/view.php

<?php
use support\view\ThinkPHP;

return [
    'handler' => ThinkPHP::class
];

app/controller/UserController.php এইভাবে

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        return view('user/hello', ['name' => 'webman']);
    }
}

ফাইল app/view/user/hello.html এইভাবে

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>
hello {$name}
</body>
</html>

আরও তথ্যের জন্য রেফার করুন think-template

মডেলের মান নির্ধারণ

view(মডেল, ভ্যারিয়েবল অ্যারে) ব্যবহার করার পাশাপাশি, আমরা যে কোন স্থানে View::assign() কল করে মডেলের মান নির্ধারণ করতে পারি। উদাহরণস্বরূপ:

<?php
namespace app\controller;

use support\Request;
use support\View;

class UserController
{
    public function hello(Request $request)
    {
        View::assign([
            'name1' => 'value1',
            'name2'=> 'value2',
        ]);
        View::assign('name3', 'value3');
        return view('user/test', ['name' => 'webman']);
    }
}

View::assign() কিছু পরিস্থিতিতে খুবই কার্যকর, যেমন একটি সিস্টেমে প্রতিটি পৃষ্ঠার শীর্ষে বর্তমানে লগ ইন করা ব্যবহারকারীর তথ্য প্রদর্শন করতে হবে, যদি প্রতিটি পৃষ্ঠায় এই তথ্য view('মডেল', ['user_info' => 'ব্যবহারকারীর তথ্য']); এর মাধ্যমে নির্ধারণ করতে হয় তবে তা খুবই কষ্টকর হবে। সমাধান হলো মধ্যস্থতার মাধ্যমে ব্যবহারকারীর তথ্য নেওয়া এবং পরে View::assign() দ্বারা ব্যবহারকারীর তথ্য মডেলে নির্ধারণ করা।

ভিউ ফাইলের পথ সম্পর্কে

কন্ট্রোলার

যখন কন্ট্রোলার view('মডেল নাম',[]); কল করে, ভিউ ফাইলগুলি নিম্নলিখিত নিয়ম অনুসারে অনুসন্ধান করা হয়:

  1. / দিয়ে শুরু হলে সরাসরি সেই পথ ব্যবহার করে ভিউ ফাইল খুঁজবে
  2. / সহ শুরু না হলে এবং একাধিক অ্যাপ নয়, তখন app/view/ এর অধীনে সংশ্লিষ্ট ভিউ ফাইল ব্যবহার করা হবে
  3. / সহ শুরু না হলে এবং একাধিক অ্যাপ হলে, app/অ্যাপ নাম/view/ এর অধীনে সংশ্লিষ্ট ভিউ ফাইল ব্যবহার করা হবে
  4. যদি মডেল প্যারামিটার প্রদান না করা হয়, তখন 2 এবং 3 এর নিয়ম অনুযায়ী স্বয়ংক্রিয়ভাবে মডেল ফাইল খুঁজবে

উদাহরণ:

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // সমান অর্থ return view('user/hello', ['name' => 'webman']);
        // সমান অর্থ return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

ক্লোজার ফাংশন

ক্লোজার ফাংশনে $request->app খালি, কোন অ্যাপের অন্তর্গত নয়, তাই ক্লোজার ফাংশন app/view/ এর অধীনে ভিউ ফাইল ব্যবহার করবে, যেমন config/route.php এ রুট সংজ্ঞায়িত করা

Route::any('/admin/user/get', function (Reqeust $reqeust) {
    return view('user', []);
});

যা app/view/user.html কে মডেল ফাইল হিসেবে ব্যবহার করবে (যখন blade মডেল ব্যবহার করা হয় তখন মডেল ফাইল হবে app/view/user.blade.php)।

নির্দিষ্ট অ্যাপ

একাধিক অ্যাপ মোডে মডেল পুনঃব্যবহারযোগ্য করতে, view($template, $data, $app = null) তৃতীয় প্যারামিটার $app প্রদান করে, যা নির্দিষ্ট করার জন্য ব্যবহার করা যেতে পারে কোন অ্যাপ ডিরেক্টরির মডেল ব্যবহার করতে হবে। যেমন view('user', [], 'admin'); এটি জোর করে ব্যবহার করবে app/admin/view/ এর অধীনে ভিউ ফাইল।

মডেল প্যারামিটার বাদ দেওয়া

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

<?php
namespace app\controller;

use support\Request;

class UserController
{
    public function hello(Request $request)
    {
        // সমান অর্থ return view('user/hello', ['name' => 'webman']);
        // সমান অর্থ return view('/app/view/user/hello', ['name' => 'webman']);
        return view(['name' => 'webman']);
    }
}

Twig সম্প্রসারণ

আমরা কনফিগারেশন view.extension কলব্যাক দিয়ে twig ভিউ ইনস্ট্যান্স সম্প্রসারণ করতে পারি, যেমন config/view.php এ নিম্নলিখিত লেখার মতো

<?php
use support\view\Twig;
return [
    'handler' => Twig::class,
    'extension' => function (\Twig\Environment $twig) {
        $twig->addExtension(new your\namespace\YourExtension()); // এক্সটেনশন যুক্ত করা
        $twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // ফিল্টার যুক্ত করা
        $twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // ফাংশন যুক্ত করা
    }
];

Blade সম্প্রসারণ

একইভাবে আমরা কনফিগারেশন view.extension কলব্যাক দিয়ে blade ভিউ ইনস্ট্যান্স সম্প্রসারণ করতে পারি, যেমন config/view.php এ নিচের মতো

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        // blade-এ নির্দেশনা যুক্ত করা
        $blade->directive('mydate', function ($timestamp) {
            return "<?php echo date('Y-m-d H:i:s', $timestamp); ?>";
        });
    }
];

blade ব্যবহার করে কম্পোনেন্ট

ধরি একটি Alert কম্পোনেন্ট যোগ করতে হবে

নতুন দিন app/view/components/Alert.php

<?php

namespace app\view\components;

use Illuminate\View\Component;

class Alert extends Component
{

    public function __construct()
    {

    }

    public function render()
    {
        return view('components/alert')->rawBody();
    }
}

নতুন দিন app/view/components/alert.blade.php

<div>
    <b style="color: red">hello blade component</b>
</div>

/config/view.php একটি অনুরূপ কোড থাকবে

<?php
use support\view\Blade;
return [
    'handler' => Blade::class,
    'extension' => function (Jenssegers\Blade\Blade $blade) {
        $blade->component('alert', app\view\components\Alert::class);
    }
];

এখন, Blade কম্পোনেন্ট Alert প্রস্তুত, মডেলে ব্যবহার করার সময় এটি নিচের মতো হবে

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>webman</title>
</head>
<body>

<x-alert/>

</body>
</html>

think-template সম্প্রসারণ

think-template view.options.taglib_pre_load ব্যবহার করে ট্যাগ লাইব্রেরি সম্প্রসারণ করতে পারে, যেমন

<?php
use support\view\ThinkPHP;
return [
    'handler' => ThinkPHP::class,
    'options' => [
        'taglib_pre_load' => your\namspace\Taglib::class,
    ]
];

বিস্তৃত তথ্যের জন্য think-template ট্যাগ সম্প্রসারণ পর্যালোচনা করুন