العرض
webman默认 تستخدم لغة php الأصلية كقالب، وبتفعيل opcache
تحقق أفضل أداء. بالإضافة إلى قالب php الأصلي، يوفر webman أيضًا محركات القوالب Twig، Blade، و think-template.
تفعيل opcache
عند استخدام العرض، يُوصى بشدة بتفعيل خياري opcache.enable
و opcache.enable_cli
في ملف php.ini لضمان تحقيق أفضل أداء لمحركات القوالب.
تثبيت Twig
- تثبيت عبر composer
composer require twig/twig
- تعديل الإعدادات
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
- تثبيت عبر composer
composer require psr/container ^1.1.1 webman/blade
- تعديل الإعدادات
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('اسم القالب',[]);
، يتم البحث عن ملفات العرض وفقًا للقاعدة التالية:
- يبدأ بـ
/
، فيتم استخدام المسار مباشرةً للبحث عن ملف العرض - لا يبدأ بـ
/
وغير تطبيق متعدد، فيتم استخدام ملف العرض المقابل فيapp/view/
- لا يبدأ بـ
/
وهو تطبيق متعدد، فيتم استخدام ملف العرض المقابل فيapp/اسم_التطبيق/view/
- إذا لم يتم تمرير معاملات القالب، يتم البحث تلقائيًا عن ملفات القالب بناءً على القاعدة 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']);
}
}
دالة الـ Closure
تكون $request->app
فارغة ضمن دالة الـ Closure، ولا تنتمي لأي تطبيق، لذلك تستخدم دالة الـ Closure ملفات العرض في 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
يمكننا توسيع مثيل عرض Twig من خلال توفير رد نداء view.extension
، مثل config/view.php
كالتالي
<?php
use support\view\Twig;
return [
'handler' => Twig::class,
'extension' => function (\Twig\Environment $twig) {
$twig->addExtension(new your\namespace\YourExtension()); // إضافة Extension
$twig->addFilter(new \Twig\TwigFilter('rot13', 'str_rot13')); // إضافة Filter
$twig->addFunction(new \Twig\TwigFunction('function_name', function () {})); // إضافة دالة
}
];
توسيع Blade
بنفس الطريقة، يمكننا توسيع مثيل عرض Blade من خلال توفير رد نداء view.extension
، مثل 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); ?>";
});
}
];
استخدام مكونات component في 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