Laravel 8视图文件引入其他视图的方法及报错解决方案
刚接触Laravel视图开发,现有header.blade.php、users.blade.php两个视图文件,在users.blade.php中引入头部文件时抛出如下报错:
include(resources/views/header.blade.php): failed to open stream: No such file or directory (View: /home/resources/views/users.blade.php)
当前users.blade.php中使用原生PHP语法引入头部,代码为:
<?php include('resources/views/header.blade.php');?>
文件其余内容包含自定义页面样式、用户列表表格渲染、分页输出、删除用户按钮逻辑、页脚引入等代码,页脚同样使用原生include('footer.php')方式加载。
- 原生
include()传入相对路径时,路径解析基准是PHP的入口文件(Laravel中入口文件为public/index.php),而非当前编辑的视图文件所在目录。你写的resources/views/header.blade.php会被解析为public/resources/views/header.blade.php,和视图实际存放的项目根目录下resources/views路径不匹配,因此触发文件不存在错误。 - 额外提示:当前代码中混用了CodeIgniter框架的专属语法,比如
base_url()、$this->session->flashdata(),这类写法在Laravel中无法直接运行,如果确定当前运行的是Laravel项目,后续需要将这类写法替换为Laravel对应的url()、session()->flash()等原生实现,否则会触发其他报错。
方案1:使用Blade官方引入指令(推荐)
Blade模板原生提供@include指令用于引入公共视图片段,不需要写完整文件路径,也不需要携带.blade.php后缀,框架会自动到resources/views目录下查找匹配的视图文件。
将原有头部引入代码:
<?php include('resources/views/header.blade.php');?>
替换为:
@include('header')
如果header.blade.php存放在resources/views的子目录下(比如常用的partials公共组件目录),使用点分隔的路径写法即可,例如@include('partials.header')。
页脚引入也可以用同样方式替换,把<?php include('footer.php');?>改为@include('footer')即可。该方式还支持向被引入的视图传递参数,灵活性远高于原生include。
方案2:坚持使用原生PHP引入时传入绝对路径
如果一定要用原生include语法,需要通过Laravel提供的助手函数拼接视图文件的绝对路径,避免相对路径解析偏差,写法如下:
<?php include(resource_path('views/header.blade.php')); ?>
resource_path()函数会直接返回项目resources目录的绝对路径,拼接后可以精准定位到视图文件位置,不会出现找不到文件的问题。
内容的提问来源于stack exchange,提问作者dev

