CodeIgniter能否通过URL或file_get_contents加载外部视图?
首先得明确:CodeIgniter的$this->load->view()方法默认只能加载应用内部application/views目录下的文件,直接传外部URL是行不通的,我来给你拆解可行的解决办法:
一、为什么直接用URL调用load->view()不行?
load->view()的工作逻辑是把传入的路径当作本地文件路径,去application/views目录下查找对应的视图文件。你尝试的$this->load->view('http://dev.app.com/Assets/2018/03/411aa377c0e092ce.html', $data, true),系统会去application/views/http://dev.app.com/Assets/...这个不存在的路径找文件,自然会报错。
二、用file_get_contents处理外部HTML的两种场景
1. 静态HTML文件(不需要解析变量)
如果你的外部HTML是纯静态的,不需要替换$data里的变量,直接用file_get_contents获取内容就可以了,比如你写的:
$email_contents = file_get_contents($email['file_location']);
这里建议:如果文件在本地服务器上,优先用绝对文件路径(比如/var/www/html/Assets/2018/03/411aa377c0e092ce.html),而不是URL,这样能避免发起HTTP请求的额外开销,效率更高。
2. 需要解析变量的HTML文件
如果外部HTML里有需要替换的变量(比如{title}、{content}这类),直接获取静态内容是不行的,这时候可以用CodeIgniter的Parser类来解析:
// 读取外部HTML内容 $html_content = file_get_contents('/path/to/external/file.html'); // 加载Parser库 $this->load->library('parser'); // 解析变量并返回结果 $body = $this->parser->parse_string($html_content, $data, true);
如果你的变量是PHP原生格式(比如<?= $title ?>),静态HTML没法直接解析,这时候更推荐用下面的方案。
三、最符合框架逻辑的方案:把外部目录加入视图路径
CodeIgniter允许你添加额外的视图目录,这样就能像加载内部视图一样,用load->view()加载外部文件,同时自动解析$data里的变量,步骤如下:
// 添加外部视图目录的绝对路径 $this->load->add_package_path('/path/to/your/Assets/2018/03/'); // 直接加载文件名,不需要完整路径 $body = $this->load->view('411aa377c0e092ce.html', $data, true); // 可选:用完后移除路径,避免影响后续视图加载 $this->load->remove_package_path('/path/to/your/Assets/2018/03/');
这个方法既利用了框架的视图解析机制,又省去了手动处理变量替换的麻烦,是最优解。
内容的提问来源于stack exchange,提问作者JianYA

