2022 EduSoho開發(fā)手冊 日常技巧之不修改文件更新系統(tǒng)模板

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;
}
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容