Laravel如何强制action返回resource/view目录外的视图
Laravel 配置Action返回packages目录下视图的方法
你可以根据自己的使用场景选下面两种配置方式:
方式一:扩展包标准命名空间加载(推荐)
如果你是在开发独立的自定义扩展包,直接在你包自带的服务提供者boot方法中调用loadViewsFrom注册视图路径即可:
// packages/mypackage/src/MyPackageServiceProvider.php (你的包服务提供者文件) public function boot() { // 第一个参数传视图目录的绝对路径,第二个参数是自定义的视图命名空间,避免重名冲突 $this->loadViewsFrom(__DIR__ . '/../view', 'mypackage'); }
注册完成后,在Action中返回视图时带上命名空间前缀即可,写法是{命名空间}::{视图名}:
// 对应加载 packages/mypackage/view/user/profile.blade.php return view('mypackage::user.profile');
如果你希望包的使用者可以通过发布命令覆盖默认视图,可以额外在boot方法中加发布配置:
public function boot() { $this->loadViewsFrom(__DIR__ . '/../view', 'mypackage'); // 执行php artisan vendor:publish时会把包视图拷贝到resource/views/vendor/mypackage目录 $this->publishes([ __DIR__ . '/../view' => resource_path('views/vendor/mypackage'), ], 'mypackage-views'); }
方式二:添加全局视图查找路径
如果你不需要做独立扩展包,只是想把packages/mypackage/view作为全局视图目录,不需要带命名空间调用,可以在项目的AppServiceProvider中注册额外的视图查找位置:
// app/Providers/AppServiceProvider.php use Illuminate\Support\Facades\View; public function boot() { View::addLocation(base_path('packages/mypackage/view')); }
这种配置下你可以直接用return view('index')的方式调用视图,框架查找视图的优先级是:先找默认的resource/views目录,找不到再去你新增的packages目录下匹配,两个目录存在同名视图时会优先加载resource/views下的文件。
注意事项
- 写路径时注意层级对应,
__DIR__对应当前执行PHP文件所在的目录,要根据你服务提供者的实际存放位置调整相对路径,避免路径写错找不到视图 - 配置后如果不生效,先执行
php artisan view:clear清除视图编译缓存,排除缓存干扰 - 多包开发场景优先用命名空间加载的方式,避免不同包之间的同名视图冲突
内容的提问来源于stack exchange,提问作者Ahmed Samna
相关产品推荐
相关产品推荐

