Open calvinalkan opened 3 years ago
Working fix, I cant submit a PR because I have a fastly different custom version of wpemerge but this will fix the issue:
public function toString() : string {
$ob_level = ob_get_level();
ob_start();
try {
$this->requireView();
}
catch ( \Throwable $e ) {
$this->handleViewException($e, $ob_level);
}
return ob_get_clean();
}
private function requireView () {
$this->engine->pushLayoutContent( $this );
if ( $this->getLayout() !== null ) {
return $this->getLayout()->requireView();
}
$this->engine->getLayoutContent();
}
private function handleViewException(\Throwable $e , $ob_level) {
while (ob_get_level() > $ob_level) {
ob_end_clean();
}
throw new ViewException('Error rendering view: [' . $this->getName() . '].');
}
Another concern I have with this is what would happen if the size of the view exceeds the max buffer output?
Version
Please add the exact versions used for each of the following:
Expected behavior
When an exception occurs inside rendering a view, all output buffers are cleared, and an exception is thrown to render an error page appropriately.
Actual behaviour
Right now, any error that happens inside view rendering will cause any HTML before the error to be printed to the client.
Steps to reproduce (in case of a bug)
Create a route:
Create a view like this:
Turn on
WP_DEBUG
(optional)Visit
yoursite.com/foo
See
Foobar
in the error page html.Comments
The reason this happens can be found inside the
PhpView
classThe
toString
method needs to have some form of error handling that resets the buffered content. If not PHP will automatically clear and print the output when an exception occurs and the script shuts down.A possible fix would be changing the relevant part to something like this: