diff options
| author | Nils Adermann <naderman@naderman.de> | 2015-01-22 16:16:21 +0100 | 
|---|---|---|
| committer | Nils Adermann <naderman@naderman.de> | 2015-01-22 16:16:21 +0100 | 
| commit | 40ab75478ed7427985e4d147eb6573ce8bb351fc (patch) | |
| tree | 8cd31410ef67f9ad1978e48272640c5f67bc2de9 /phpBB/phpbb | |
| parent | a737eeb6cea2d494be4c8ae5e1101d1015746191 (diff) | |
| parent | 7fef91afd28290ce268f671eb525dedf5ade944d (diff) | |
| download | forums-40ab75478ed7427985e4d147eb6573ce8bb351fc.tar forums-40ab75478ed7427985e4d147eb6573ce8bb351fc.tar.gz forums-40ab75478ed7427985e4d147eb6573ce8bb351fc.tar.bz2 forums-40ab75478ed7427985e4d147eb6573ce8bb351fc.tar.xz forums-40ab75478ed7427985e4d147eb6573ce8bb351fc.zip | |
Merge pull request #3173 from Nicofuma/ticket/13361
[ticket/13361] Improve the exception listener
Diffstat (limited to 'phpBB/phpbb')
| -rw-r--r-- | phpBB/phpbb/controller/helper.php | 2 | ||||
| -rw-r--r-- | phpBB/phpbb/event/kernel_exception_subscriber.php | 59 | ||||
| -rw-r--r-- | phpBB/phpbb/exception/exception_interface.php | 29 | ||||
| -rw-r--r-- | phpBB/phpbb/exception/http_exception.php | 70 | ||||
| -rw-r--r-- | phpBB/phpbb/exception/runtime_exception.php | 52 | 
5 files changed, 199 insertions, 13 deletions
| diff --git a/phpBB/phpbb/controller/helper.php b/phpBB/phpbb/controller/helper.php index 52e6947c2c..7ee90b10ba 100644 --- a/phpBB/phpbb/controller/helper.php +++ b/phpBB/phpbb/controller/helper.php @@ -184,6 +184,8 @@ class helper  	* @param string $message The error message  	* @param int $code The error code (e.g. 404, 500, 503, etc.)  	* @return Response A Response instance +	* +	* @deprecated 3.1.3 (To be removed: 3.3.0) Use exceptions instead.  	*/  	public function error($message, $code = 500)  	{ diff --git a/phpBB/phpbb/event/kernel_exception_subscriber.php b/phpBB/phpbb/event/kernel_exception_subscriber.php index 44e87507f9..eb7831ad34 100644 --- a/phpBB/phpbb/event/kernel_exception_subscriber.php +++ b/phpBB/phpbb/event/kernel_exception_subscriber.php @@ -14,9 +14,10 @@  namespace phpbb\event;  use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;  use Symfony\Component\HttpKernel\KernelEvents;  use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; -use Symfony\Component\HttpKernel\Exception\HttpException;  use Symfony\Component\HttpFoundation\Response;  class kernel_exception_subscriber implements EventSubscriberInterface @@ -53,23 +54,55 @@ class kernel_exception_subscriber implements EventSubscriberInterface  	*/  	public function on_kernel_exception(GetResponseForExceptionEvent $event)  	{ -		page_header($this->user->lang('INFORMATION')); -  		$exception = $event->getException(); -		$this->template->assign_vars(array( -			'MESSAGE_TITLE'		=> $this->user->lang('INFORMATION'), -			'MESSAGE_TEXT'		=> $exception->getMessage(), -		)); +		$message = $exception->getMessage(); + +		if ($exception instanceof \phpbb\exception\exception_interface) +		{ +			$message = call_user_func_array(array($this->user, 'lang'), array_merge(array($message), $exception->get_parameters())); +		} + +		if (!$event->getRequest()->isXmlHttpRequest()) +		{ +			page_header($this->user->lang('INFORMATION')); + +			$this->template->assign_vars(array( +				'MESSAGE_TITLE' => $this->user->lang('INFORMATION'), +				'MESSAGE_TEXT'  => $message, +			)); + +			$this->template->set_filenames(array( +				'body' => 'message_body.html', +			)); + +			page_footer(true, false, false); + +			$response = new Response($this->template->assign_display('body'), 500); +		} +		else +		{ +			$data = array(); + +			if (!empty($message)) +			{ +				$data['message'] = $message; +			} + +			if (defined('DEBUG')) +			{ +				$data['trace'] = $exception->getTrace(); +			} -		$this->template->set_filenames(array( -			'body'	=> 'message_body.html', -		)); +			$response = new JsonResponse($data, 500); +		} -		page_footer(true, false, false); +		if ($exception instanceof HttpExceptionInterface) +		{ +			$response->setStatusCode($exception->getStatusCode()); +			$response->headers->add($exception->getHeaders()); +		} -		$status_code = $exception instanceof HttpException ? $exception->getStatusCode() : 500; -		$response = new Response($this->template->assign_display('body'), $status_code);  		$event->setResponse($response);  	} diff --git a/phpBB/phpbb/exception/exception_interface.php b/phpBB/phpbb/exception/exception_interface.php new file mode 100644 index 0000000000..e8526a35f5 --- /dev/null +++ b/phpBB/phpbb/exception/exception_interface.php @@ -0,0 +1,29 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\exception; + +/** + * Interface exception_interface + * + * Define an exception which support a language var as message. + */ +interface exception_interface +{ +	/** +	 * Return the arguments associated with the message if it's a language var. +	 * +	 * @return array +	 */ +	public function get_parameters(); +} diff --git a/phpBB/phpbb/exception/http_exception.php b/phpBB/phpbb/exception/http_exception.php new file mode 100644 index 0000000000..0e6ffe4f59 --- /dev/null +++ b/phpBB/phpbb/exception/http_exception.php @@ -0,0 +1,70 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\exception; + +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; + +/** + * Class http_exception + */ +class http_exception extends runtime_exception implements HttpExceptionInterface +{ +	/** +	 * Http status code. +	 * +	 * @var integer +	 */ +	private $status_code; + +	/** +	 * Additional headers to set in the response. +	 * +	 * @var array +	 */ +	private $headers; + +	/** +	 * Constructor +	 * +	 * @param integer		$status_code	The http status code. +	 * @param string		$message		The Exception message to throw (must be a language variable). +	 * @param array			$parameters		The parameters to use with the language var. +	 * @param \Exception	$previous		The previous exception used for the exception chaining. +	 * @param array			$headers		Additional headers to set in the response. +	 * @param integer		$code			The Exception code. +	 */ +	public function __construct($status_code, $message = "", array $parameters = array(), \Exception $previous = null, array $headers = array(), $code = 0) +	{ +		$this->status_code = $status_code; +		$this->headers = $headers; + +		parent::__construct($message, $parameters, $previous, $code); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function getStatusCode() +	{ +		return $this->status_code; +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function getHeaders() +	{ +		return $this->headers; +	} +} diff --git a/phpBB/phpbb/exception/runtime_exception.php b/phpBB/phpbb/exception/runtime_exception.php new file mode 100644 index 0000000000..6568bbf86f --- /dev/null +++ b/phpBB/phpbb/exception/runtime_exception.php @@ -0,0 +1,52 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\exception; + +/** + * Class runtime_exception + * + * Define an exception which support a language var as message. + */ +class runtime_exception extends \RuntimeException implements exception_interface +{ +	/** +	 * Parameters to use with the language var. +	 * +	 * @var array +	 */ +	private $parameters; + +	/** +	 * Constructor +	 * +	 * @param string		$message	The Exception message to throw (must be a language variable). +	 * @param array			$parameters	The parameters to use with the language var. +	 * @param \Exception	$previous	The previous runtime_exception used for the runtime_exception chaining. +	 * @param integer		$code		The Exception code. +	 */ +	public function __construct($message = "", array $parameters = array(), \Exception $previous = null, $code = 0) +	{ +		$this->parameters = $parameters; + +		parent::__construct($message, $code, $previous); +	} + +	/** +	 * {@inheritdoc} +	 */ +	public function get_parameters() +	{ +		return $this->parameters; +	} +} | 
