我把view方法統(tǒng)一封裝放在base.php中的base類里,然后其他控制器繼承extends base,需要調(diào)用視圖時(shí)$this->view(...),沒有升級(jí)之前使用默認(rèn)路徑?jīng)]有問題view([xxx]),升級(jí)后默認(rèn)路徑定位到我封裝在base類的方法了,所有導(dǎo)致找不到控制器的真正路徑。
模板引用的路徑也不對(duì)了: {% include 'public/header.twig'} %}
// class Base
protected function view(mixed $template = null, array $vars = []): Response
{
// 其他業(yè)務(wù)邏輯...
return view($template, $vars);
}
// 控制器
// class TestController extends Base
public function index(Request $request): Response
{
return $this->view(['a' => 88]);
// 這里正確路徑應(yīng)該是 app/view/test/index.twig
// 但是得到的路徑卻是 app/view/test/view.twig
}
導(dǎo)致出問題的原因在helpers.php的template_inputs函數(shù)里,希望優(yōu)化一下:
// template_inputs()函數(shù)
$backtrace = debug_backtrace();
$action = $backtrace[2]['function'] ?? $request->action;
如果確實(shí)需要使用debug_backtrace()來定位,那應(yīng)該檢查當(dāng)前方法是否在當(dāng)前控制器下才是正確的路徑。
當(dāng)然,還需要考慮模板引擎引用其他模板的路徑問題,之前用相對(duì)路徑?jīng)]有問題,現(xiàn)在用絕對(duì)路徑引用模板路徑也有問題。
$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()后再調(diào)用繼承方法就會(huì)有問題
webman:1.6.12
Workerman:5.0.0
執(zhí)行
composer require workerman/webman-framework:dev-master
試下
更新了,這個(gè)問題還沒解決,模板引用的路徑也不對(duì):{% include 'public/header.twig'} %}
在app/view/test/index.twig 引入 在app/view/public/header.twig
我覺得模板路徑應(yīng)該要固定,如果動(dòng)態(tài)獲取,很難解決在模板中引用其他模板的路徑問題
//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);
}