webman的view默认路径有BUG

wgole

问题描述

我把view方法统一封装放在base.php中的base类里,然后其他控制器继承extends base,需要调用视图时$this->view(...),没有升级之前使用默认路径没有问题view([xxx]),升级后默认路径定位到我封装在base类的方法了,所有导致找不到控制器的真正路径。

模板引用的路径也不对了: {% include 'public/header.twig'} %}

程序代码或配置

// class Base
    protected function view(mixed $template = null, array $vars = []): Response
    {
        // 其他业务逻辑...

        return view($template, $vars);
    }

// 控制器
// class TestController extends Base
    public function index(Request $request): Response
    {
        return $this->view(['a' => 88]);

        // 这里正确路径应该是 app/view/test/index.twig
        // 但是得到的路径却是 app/view/test/view.twig
    }

导致出问题的原因在helpers.php的template_inputs函数里,希望优化一下:

// template_inputs()函数
            $backtrace = debug_backtrace();
            $action = $backtrace[2]['function'] ?? $request->action;

如果确实需要使用debug_backtrace()来定位,那应该检查当前方法是否在当前控制器下才是正确的路径。
当然,还需要考虑模板引擎引用其他模板的路径问题,之前用相对路径没有问题,现在用绝对路径引用模板路径也有问题。

            $action = $request->action;
            $backtrace = debug_backtrace();
            foreach ($backtrace as $backtraceItem) {
                if (isset($backtraceItem['class']) && $backtraceItem['class'] == $request->controller && isset($backtraceItem['function'])) {
                    $action = $backtraceItem['function'];
                    break;
                }
            }

重现问题的步骤

只要在继承类封装view()后再调用继承方法就会有问题

操作系统环境及workerman/webman等具体版本

webman:1.6.12
Workerman:5.0.0

268 1 1
1个回答

walkor 打赏

执行
composer require workerman/webman-framework:dev-master
试下

  • wgole 16天前

    更新了,这个问题还没解决,模板引用的路径也不对:{% include 'public/header.twig'} %}

    在app/view/test/index.twig 引入 在app/view/public/header.twig

  • wgole 16天前

    测试了下,如果需要在模板引用其他页面,template_inputs函数里的模板路径只能用相对路径,看看大佬有什么解决办法?

  • wgole 16天前

    我觉得模板路径应该要固定,如果动态获取,很难解决在模板中引用其他模板的路径问题
    //function render

        $viewPath = $app === '' ? "$baseViewPath/view/" : "$baseViewPath/$app/view/";
        $viewPath = str_replace('\\', '/', $viewPath);
        if ($template[0] === '/') {
            $templatePath = str_replace('\\', '/', base_path() . $template);
            $template = str_replace($viewPath, '', $templatePath);
        }
  • walkor 16天前

    再更新 composer require workerman/webman-framework:dev-master 试下

  • wgole 16天前

    OK了

×
🔝