前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >怎么在 Laravel 中移除核心服务-视图

怎么在 Laravel 中移除核心服务-视图

作者头像
seth-shi
发布2023-12-18 14:58:58
1130
发布2023-12-18 14:58:58
举报
文章被收录于专栏:seth-shi的专栏
  • 上一篇文章减少服务提供者的启动加速你服务的性能 2.0
  • 有提到过怎么移除服务提供者 , 不过有网友说, 直接移除视图服务会出错, 这里就写一篇文章怎么移除视图服务
  • 下载一个全新的Laravel项目 composer create-project laravel/laravel=7.* laravel-demo
  • 然后我们直接使用内置的服务运行
代码语言:javascript
复制
cd laravel-demo && php artisan serve
Laravel development server started: http://127.0.0.1:8000
[Wed May 26 16:10:31 2021] PHP 7.4.3 Development Server (http://127.0.0.1:8000) started
  • 这时候访问本机的8000端口就可以看到界面了

Laravel

  • 因为我们要移除视图, 所以把首页的路由routes/web.php的代码修改为
代码语言:javascript
复制
Route::get('/', function () {
    return [
        'code' => 200,
        'msg' => 'hello'
    ];
});
  • 然后再访问8000端口

Laravel

  • 然后我们开始注释config/app.php中的视图提供者Illuminate\View\ViewServiceProvider::class, 再次访问首页

Laravel

  • 可以看到已经出现错误Target class [view.engine.resolver] does not exist.这个错误其实是facade/ignition这个服务提供者导致的,facade/ignition是一个漂亮的错误页面, 它依赖视图服务, 并且是自动注册的,所以我们要做的就是不要注册它.
  • 把一下内容增加到composer.json
代码语言:javascript
复制
 "extra": {
    "laravel": {
        "dont-discover": [
            "facade/ignition"
        ]
    }
},
  • 然后运行composer dump-auto
  • 再次访问首页路由还是有错误

Laravel

  • 不过这次错误没那么好看, 因为用的是以前Laravel默认的错误页面,并且错误消息不足,我们查看一下错误日志文件storage/logs/laravel.log

Laravel

  • 从图片中看到Session的启动导致的错误,不过在想这两个并没有什么关系,后面排查了一会,终于找到问题所在

Laravel

Laravel

  • 其实是这个web中间组里的ShareErrorsFromSession, 从Session中获取错误, 然后共享到视图里, 这里就会依赖视图服务, 我们注释掉这个中间件
  • 然后再次访问首页

Laravel

  • 如果Laravel版本低的话,Illuminate\Pagination\PaginationServiceProvider::classIlluminate\Notifications\NotificationServiceProvider::class这两个服务提供者也是依赖视图服务的,不过新版本的已经修改为延迟加载可不注释
  • 不过这里还没完整,还有错误的处理,比如我们访问http://localhost:8000/no, 这个路由我们并没有写

Laravel

  • 当然就会出现这个错误, 因为默认的错误处理, Laravel会去找storage/views/errors/404.blade.php的视图文件(根据状态码找对应的文件)
  • 我们开始自定义错误, 找到文件app\Exceptions\Handler.php自定义处理错误
代码语言:javascript
复制
    public function render($request, Throwable $exception)
    {
        $code = 500;
        if ($exception instanceof NotFoundHttpException) {
            $code = 404;
        }
        return (
            new Response(json_encode([
                    'code' => $code,
                    'msg' => $exception->getMessage()]
            ))
        )
        ->withHeaders(['Content-Type' => 'application/json']);
// 注释默认的错误处理
//        return parent::render($request, $exception);
    }
  • 再次访问页面就可以看到自定义的错误了

错误

More

  • 上面已经说了如果移除服务,但是项目APIadmin混合,admin需要使用视图,API不需要. 这种时候我的建议是在config/app.php增加一个配置enable_admin, 然后判断当前环境是API移除掉不必要服务提供者,也不要启动后台的服务,具体可查看减少服务提供者的启动加速你服务的性能 2.0
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-05-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • More
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档