2022 EduSoho開發(fā)手冊 日常技巧之不修改文件更新系統(tǒng)模板
業(yè)務場景:在日常開發(fā)后,可能會修改到程序自身的模板文件,但是這些文件可能會隨著系統(tǒng)的更新被覆蓋掉。所以我們需要一個注入的方式,在不修改自身模板文件的情況下,進行代碼的調整
操作方式
創(chuàng)建渲染視圖解析器
RenderViewResolver
<?php
/*
* 作者:少宇 - 賽馳網(wǎng)絡
* 聯(lián)系:170 33333 111
* 時間:2022/2/15 上午4:23
* 網(wǎng)址:https://www.saichinet.com
*
* 山東賽馳網(wǎng)絡科技有限公司
* Shandong Search Network Technology Co., Ltd.
* Copyright ? 2012-2020 Search Network, All Rights Reserved
*/
namespace DiscordPlugin\Biz\Discord\Util;
use AppBundle\Component\ViewResolver\RenderViewResolver;
class DiscordRenderViewResolver implements RenderViewResolver
{
public function __construct($biz)
{
$this->biz = $biz;
}
public function generateRenderView($view, array $parameters = array())
{
if (array_key_exists($bizPrefix, $this->biz['template_extension.discord'])) {
return $this->biz["template_extension.discord"][$view];
}
return $view;
}
}
注冊解析器與過濾文件
DiscordPlugin
use DiscordPlugin\Biz\Discord\Util\DiscordRenderViewResolver;
// 需要替換的模板路徑
$biz['template_extension.discord'] = [
'settings/binds.html.twig' => 'DiscordPlugin:settings:binds.html.twig',
'login/oauth2-logins-block.html.twig' => 'DiscordPlugin:login:oauth2-logins-block.html.twig',
];
$biz['render_view_resolvers'] = function ($biz) {
return [
new DiscordRenderViewResolver($biz),
];
};
剖析思路
DefaultController
class DiscordController extends BaseController
public function indexAction()
{
return $this->render('DiscordPlugin:Default:index.html.twig');
}
在程序的控制內的頁面輸入使用的是"$this->render"方法,
BaseController
public function render($view, array $parameters = [], Response $response = null)
{
$biz = $this->getBiz();
foreach ($biz['render_view_resolvers'] as $resolver) {
$view = $resolver->generateRenderView($view, $parameters);
}
return parent::render($view, $parameters, $response);
}
頁面渲染有使用到$biz['render_view_resolvers'],我們就從$biz['render_view_resolvers']下手
DefaultServiceProvider
$biz['render_view_resolvers'] = function ($biz) {
return [
new CourseRenderViewResolver($biz),
];
};
這是一個覆寫方法
CourseRenderViewResolver
public function generateRenderView($view, array $parameters = array())
{
if (isset($parameters['course'])) {
$type = $parameters['course']['type'];
} elseif (isset($parameters['courseSet'])) {
$type = $parameters['courseSet']['type'];
} elseif (isset($parameters['params']['type'])) {
$type = $parameters['params']['type'];
} else {
return $view;
}
return DynUrlToolkit::getUrl($this->biz, $view, array('type' => $type));
}
業(yè)務判斷
DynUrlToolkit
public static function getUrl($biz, $baseUrl, $params)
{
$twigSegs = explode('.html.twig', $baseUrl);
$bizPrefix = $twigSegs[0];
$type = $params['type'];
if (!empty($biz["template_extension.{$type}"]) && !empty($biz["template_extension.{$type}"][$bizPrefix])) {
return $biz["template_extension.{$type}"][$bizPrefix];
}
return $baseUrl;
}