PHP视图调用控制器view()函数时代码被渲染为纯文本,页面无法加载头部文件问题求助
问题分析与解决方案
嘿,刚看了你的问题,这是新手用PHP MVC很容易踩的一个坑,我来给你捋清楚~
核心问题出在哪?
你当前的view()方法用file_get_contents()读取视图文件,然后返回这个纯文本内容。当你在Home控制器里echo $this->view('home')时,只是把文件里的所有内容(包括PHP代码)原封不动地输出给浏览器了——浏览器根本不会解析PHP代码,自然就把它当成纯文本显示出来了。
而我们需要的是让PHP执行视图文件里的代码,再把执行后的HTML输出给浏览器,这时候file_get_contents()就不适用啦。
怎么修改?
我们需要把file_get_contents()换成include/require,这两个语句会让PHP解析并执行目标文件里的代码,而不是仅仅读取文本。
第一步:修改主Controller的view方法
调整逻辑,直接include视图文件,而不是返回内容:
<?php /* * main controller class */ class Controller { public function view($view, $data = array()) { extract($data); $viewFilePath = "../private/views/{$view}.view.php"; if(file_exists($viewFilePath)) { // 用include执行视图文件里的PHP代码 include $viewFilePath; } else { // 视图不存在时加载404页面 include "../private/views/404.view.php"; } } }
第二步:修改Home控制器的index方法
因为include已经会直接输出内容了,所以不需要再用echo了:
<?php /** * home controller */ class Home extends Controller { public function index() { // code... // 直接调用view方法,无需echo $this->view('home'); } }
额外提醒
- 注意文件路径的正确性:
../private/views/这个路径是相对于你的入口文件(比如index.php)的,确保你的入口文件位置和视图文件的相对路径是对的,不然会找不到文件。 extract($data)会把你传入的数组转换成单个变量,这样在视图文件里就能直接用$xxx而不是$data['xxx']了,这个逻辑是没问题的。
这样修改后,再访问页面,视图里的PHP代码就会被正常执行,你就能看到包含头部的正常页面啦~
内容的提问来源于stack exchange,提问作者user16269676
相关产品推荐
相关产品推荐

