Laravel项目可通过自定义ViewFactory子类实现Blade模板免.blade.php后缀渲染;在AppServiceProvider boot()中替换view绑定,重写make()方法修改路径映射,并在config/view.php中配置extensions数组(.blade.php须置首),即可支持.php、.html、.twig等后缀。

让Laravel项目中的Blade模板文件不再强制使用.blade.php后缀,而是支持直接用.php、.html甚至自定义后缀(如.twig)渲染视图,同时不改动核心源码、不引入额外包、不重写View Finder或Compiler。
替换默认视图解析器
在app/Providers/AppServiceProvider.php的boot()方法中注册自定义视图解析器。
先删除原有view绑定,再用Container::singleton()重新绑定一个继承自Illuminate\View\Factory的子类实例。
这一步必须在view服务被首次解析前完成,否则绑定无效——【AppServiceProvider的boot方法是唯一安全时机】。
编写轻量级ViewFactory子类
新建app/Support/CustomViewFactory.php,内容仅12行:
继承Illuminate\View\Factory,重写make()方法;调用父类resolveView()获取视图对象后,手动修改其$view属性为去掉后缀的逻辑路径(如home.index→home/index);再调用getFinder()->find()时传入原始路径+新后缀数组。
关键点在于:不改FileViewFinder,只干预make()入口处的路径映射逻辑——这样既绕过Blade专属后缀校验,又保留所有缓存、共享数据、组件等功能。
配置允许的后缀列表
在config/view.php末尾追加:
'extensions' => ['php', 'html', 'twig']
这个数组会被FileViewFinder原生读取,无需任何额外代码介入。Laravel 9+已内置支持多后缀查找,只要确保find()调用时传入的是标准路径格式(不含后缀),它就会自动按顺序尝试每个扩展名。
注意:.blade.php必须保留在该数组最前面,否则Blade编译器将无法触发——【否则@csrf、@yield等指令全部失效】。
验证模板文件命名规则
现在可直接创建resources/views/home/index.php,内容写<?php echo $title ?? 'Hello'; ?>。
控制器中调用return view('home.index');即可渲染,无需加后缀,也不需要修改任何路由或中间件。
如果想用.html后缀,就建resources/views/about.html,然后view('about')——路径名与文件名严格对应,不带扩展名。


















