最新消息:文章中包含代码时,请遵守代码高亮规范!

symfony自定义错误页面-基于覆写ExceptionController实现【原创】

PHP Pota 451浏览 0评论

声明:本文方法基于symfony2.8撰写 3.3版本机制改变本文仅限参考

在使用symfony进行项目开发过程中,dev环境下的报错页面一度帮助解决了很多代码上的错误,不过在生产环境下因为dev模式下的页面涉及到很多敏感参数,只单单的显示一个很简单的错误页面,有些不可控的错误(例如用户手动数据导致的404)显示默认的404不是很美观,symfony官方文档提供了一套很简单的方法实现404等错误页面的替换方法,此方法本文不是重点请参考官方文档替换对应twig文件即可。
首先新建了一个控制器(ExceptionsController)并继承Symfony\Bundle\TwigBundle\Controller\ExceptionController
因为需要覆写参数故这里在当前新建的ExceptionsController中覆写父级的showAction方法以实现自定义参数的添加。
先放出Controller代码

<?php

/**
 * 错误覆写
 *
 * Author: Pota
 * Datetime: 7/23/17 11:44 PM
 */

namespace BaseBundle\Controller;

use Model\a_my;
use Twig\Environment;
use Symfony\Bundle\TwigBundle\Controller\ExceptionController;
use Symfony\Component\HttpKernel\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DependencyInjection\ContainerInterface;

class ExceptionsController extends ExceptionController
{
    private $judge_login;

    public function __construct(Environment $twig, $debug, ContainerInterface $container)
    { //本文项目需要在错误页面额外传递已登录用户信息 此方法目前是写在项目底层控制器中的此处无法直接通过
      //container调用故将此方法设置为服务在此特殊使用一次
        parent::__construct($twig,$debug);
        $this->judge_login = $container->get('services.judge_login'); 

    }

    /**
     * 覆写默认错误页面
     *
     * A "showException" request parameter can be used to force display of an error page (when set to false) or
     * the exception page (when true). If it is not present, the "debug" value passed into the constructor will
     * be used.
     *
     * @param Request              $request   The request
     * @param FlattenException     $exception A FlattenException instance
     * @param DebugLoggerInterface $logger    A DebugLoggerInterface instance
     *
     * @return Response
     *
     * @throws \InvalidArgumentException When the exception template does not exist
     */
    public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null)
    {
        $currentContent = $this->getAndCleanOutputBuffering($request->headers->get('X-Php-Ob-Level', -1));
        $showException = $request->attributes->get('showException', $this->debug); // As opposed to an additional parameter, this maintains BC

        $code = $exception->getStatusCode();   //错误信息代码 ex:404 403 500等 下面代码不进行说明自己看底层代码即可

        $data = array(
            'status_code' => $code,
            'status_text' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '',
            'exception' => $exception,
            'logger' => $logger,
            'currentContent' => $currentContent,
            'user_info' => array()
        );
        //覆写404和500错误页面参数
        if (in_array($code, array(404,500))){
            $my = new a_my();
            $judge = $this->judge_login->judgeLogin($request);
            $data['user_info']= $judge['errorCode'] == 0 ? $my->getUserInfo($judge['id']) : array();
        }

        return new Response($this->twig->render(
            (string) $this->findTemplate($request, $request->getRequestFormat(), $code, $showException),$data));
    }
}

写好上面的方法之后再设置twig.exception_controller配置选项来指向它

# app/config/config.yml
twig:
    exception_controller:  BaseBundle:Exceptions:showAction

为了在symfony调用过程中实现构造函数所需参数的设置,将之前定义的方法设置为app.exception_controller服务来实现参数的初始化

# app/config/services.yml
services:
    services.judge_login:   #之前使用到的无法调用的获取参数的方法所在的控制器设置为服务已调用获取对应参数
        class: BaseBundle\Controller\BaseController
        arguments: []

    app.exception_controller:   #这里需要额外传递service_container用来在构造函数中获取服务对象
        class: BaseBundle\Controller\ExceptionsController
        arguments: ['@twig', '%kernel.debug%', '@service_container']

到此,ExceptionController的覆写就结束了,具体的业务代码自行实现即可,不过为方便dev模式下开发,上文中status_code等参数请勿去除,防止引起调试上的麻烦,若是遇到本文方法无法解决的错误也可留言贴出或者邮箱联系wangrun@zmit.com能力范围内会尝试帮忙解决

转载时请注明出处及相应链接,本文永久地址:http://blog.it985.com/21825.html


pay_weixin
pay_weixin
微信打赏
pay_weixin
支付宝打赏
感谢您对作者Pota的打赏,我们会更加努力!    如果您想成为作者,请点我

您必须 登录 才能发表评论!