Skip to content

Commit d6cf04a

Browse files
authored
remove generated error pages (#3827)
1 parent eaf230c commit d6cf04a

30 files changed

+178
-718
lines changed

build.xml

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -128,25 +128,25 @@
128128

129129
<target name="build" depends="build-deploy-part-1-db-independent,build-deploy-part-2-db-dependent" description="Builds application for production preserving your DB."/>
130130

131-
<target name="build-demo" depends="production-protection,wipe,build-version-generate,composer-prod,redis-check,dirs-create,assets,npm,demo-data,error-pages-generate,warmup,clean-redis-old" description="Builds application for production with clean demo DB."/>
131+
<target name="build-demo" depends="production-protection,wipe,build-version-generate,composer-prod,redis-check,dirs-create,assets,npm,demo-data,warmup,clean-redis-old" description="Builds application for production with clean demo DB."/>
132132

133-
<target name="build-demo-ci" depends="production-protection,build-version-generate,wipe-excluding-logs,composer-dev,timezones-check,dirs-create,test-dirs-create,assets,npm,demo-data,error-pages-generate,tests-acceptance-build,clean-redis-old,checks-ci" description="Builds application for development with clean demo DB and runs CI checks."/>
133+
<target name="build-demo-ci" depends="production-protection,build-version-generate,wipe-excluding-logs,composer-dev,timezones-check,dirs-create,test-dirs-create,assets,npm,demo-data,tests-acceptance-build,clean-redis-old,checks-ci" description="Builds application for development with clean demo DB and runs CI checks."/>
134134

135-
<target name="build-demo-dev" depends="production-protection,build-version-generate,wipe-excluding-logs,composer-dev,timezones-check,dirs-create,test-dirs-create,assets,npm,demo-data,error-pages-generate,tests-acceptance-build,clean-redis-old,checks" description="Builds application for development with clean demo DB and runs checks on changed files."/>
135+
<target name="build-demo-dev" depends="production-protection,build-version-generate,wipe-excluding-logs,composer-dev,timezones-check,dirs-create,test-dirs-create,assets,npm,demo-data,tests-acceptance-build,clean-redis-old,checks" description="Builds application for development with clean demo DB and runs checks on changed files."/>
136136

137137
<target name="build-demo-dev-quick" depends="production-protection,build-version-generate,wipe-excluding-logs,composer-dev,dirs-create,test-dirs-create,assets,npm,demo-data,clean-redis-old" description="Builds application for development with clean demo DB while skipping nonessential steps."/>
138138

139139
<target name="build-deploy-part-1-db-independent" depends="build-version-generate,clean,composer-prod,dirs-create,assets,npm" description="First part of application build for production preserving your DB (can be run without maintenance page)."/>
140140

141-
<target name="build-deploy-part-2-db-dependent" depends="check-migrate-uploaded-files,elasticsearch-index-migrate,redis-check,db-migrations,domains-data-create,friendly-urls-generate,domains-urls-replace,migrate-uploaded-files-force,error-pages-generate,warmup" description="Second part of application build for production preserving your DB (must be run with maintenance page when containing DB migrations)."/>
141+
<target name="build-deploy-part-2-db-dependent" depends="check-migrate-uploaded-files,elasticsearch-index-migrate,redis-check,db-migrations,domains-data-create,friendly-urls-generate,domains-urls-replace,migrate-uploaded-files-force,warmup" description="Second part of application build for production preserving your DB (must be run with maintenance page when containing DB migrations)."/>
142142

143-
<target name="build-dev" depends="build-version-generate,clean,composer-dev,timezones-check,dirs-create,test-dirs-create,assets,npm,db-migrations,domains-data-create,friendly-urls-generate,friendly-url-entity-mapping-check,elasticsearch-index-recreate,elasticsearch-export,error-pages-generate,tests-acceptance-build,clean-redis-old,checks" description="Builds application for development preserving your DB and runs checks on changed files."/>
143+
<target name="build-dev" depends="build-version-generate,clean,composer-dev,timezones-check,dirs-create,test-dirs-create,assets,npm,db-migrations,domains-data-create,friendly-urls-generate,friendly-url-entity-mapping-check,elasticsearch-index-recreate,elasticsearch-export,tests-acceptance-build,clean-redis-old,checks" description="Builds application for development preserving your DB and runs checks on changed files."/>
144144

145145
<target name="build-dev-quick" depends="build-version-generate,clean,composer-dev,dirs-create,test-dirs-create,assets,npm,db-migrations,domains-data-create,friendly-urls-generate,friendly-url-entity-mapping-check,elasticsearch-index-migrate,clean-redis-old" description="Builds application for development preserving your DB while skipping nonessential steps."/>
146146

147-
<target name="build-new" depends="production-protection,wipe,build-version-generate,composer-prod,redis-check,dirs-create,assets,npm,db-rebuild,elasticsearch-index-recreate,error-pages-generate,warmup,clean-redis-old" description="Builds application for production with clean DB (with base data only)."/>
147+
<target name="build-new" depends="production-protection,wipe,build-version-generate,composer-prod,redis-check,dirs-create,assets,npm,db-rebuild,elasticsearch-index-recreate,warmup,clean-redis-old" description="Builds application for production with clean DB (with base data only)."/>
148148

149-
<target name="build-review-ci" depends="production-protection,wipe,build-version-generate,redis-check,dirs-create,db-demo,error-pages-generate,warmup,elasticsearch-index-recreate,elasticsearch-export,clean-redis-old" description="Builds application for review with clean demo DB."/>
149+
<target name="build-review-ci" depends="production-protection,wipe,build-version-generate,redis-check,dirs-create,db-demo,warmup,elasticsearch-index-recreate,elasticsearch-export,clean-redis-old" description="Builds application for review with clean demo DB."/>
150150

151151
<target name="build-version-generate" description="Generates parameters_version.yaml config file with a new build version number.">
152152
<exec executable="${path.php.executable}" checkreturn="true" outputProperty="version">
@@ -231,7 +231,6 @@
231231
<phingcall target="frontend-api-generate-new-keys"/>
232232
<phingcall target="elasticsearch-index-recreate"/>
233233
<phingcall target="elasticsearch-export"/>
234-
<phingcall target="error-pages-generate"/>
235234
<phingcall target="warmup"/>
236235
</target>
237236

@@ -759,14 +758,6 @@
759758
</if>
760759
</target>
761760

762-
<target name="error-pages-generate" depends="prod-warmup,redis-check" description="Generates error pages displayed in production environment.">
763-
<exec executable="${path.php.executable}" passthru="true" checkreturn="true">
764-
<arg value="${path.bin-console}"/>
765-
<arg value="shopsys:error-page:generate-all"/>
766-
<arg value="--verbose"/>
767-
</exec>
768-
</target>
769-
770761
<target name="eslint-check" description="Find JS coding standard violations in all files using ESLint and print human readable output." hidden="true">
771762
<exec executable="${path.npm.executable}" logoutput="true" passthru="true" checkreturn="true">
772763
<arg value="run"/>
@@ -1235,14 +1226,6 @@
12351226

12361227
<target name="test-elasticsearch-index-recreate" depends="production-protection,test-elasticsearch-index-delete,test-elasticsearch-index-migrate" description="Recreates structure for searching via elasticsearch in test environment (deletes existing structure and creates new one)"/>
12371228

1238-
<target name="test-error-pages-generate" depends="redis-check" description="Generates error pages for testing environment.">
1239-
<exec executable="${path.php.executable}" passthru="true" checkreturn="true">
1240-
<arg value="${path.bin-console}"/>
1241-
<arg value="shopsys:error-page:generate-all"/>
1242-
<arg value="--env=test"/>
1243-
</exec>
1244-
</target>
1245-
12461229
<target name="test-friendly-url-entity-mapping-check" description="Checks completeness of entity mapping by route name">
12471230
<exec executable="${path.php.executable}" passthru="true" checkreturn="true">
12481231
<arg value="${path.bin-console}"/>
@@ -1269,7 +1252,7 @@
12691252
</exec>
12701253
</target>
12711254

1272-
<target name="tests" depends="test-db-demo,test-elasticsearch-index-recreate,test-elasticsearch-export,test-error-pages-generate,tests-unit,tests-functional,tests-smoke" description="Runs unit, functional and smoke tests. Builds new test database in the process."/>
1255+
<target name="tests" depends="test-db-demo,test-elasticsearch-index-recreate,test-elasticsearch-export,tests-unit,tests-functional,tests-smoke" description="Runs unit, functional and smoke tests. Builds new test database in the process."/>
12731256

12741257
<target name="tests-acceptance" depends="production-protection,clean,test-clean-redis" description="Runs acceptance tests. Running Selenium server is required (Selenium is always running in Docker setup).">
12751258
<phingcall target="tests-acceptance-before"/>

phpstan.neon

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@ parameters:
88
-
99
message: '~Instantiated class App\\Kernel not found~'
1010
path: *
11-
-
12-
message: '#Call to method .+\(\) on an unknown class App\\Kernel\.#'
13-
path: %currentWorkingDirectory%/src/Component/Error/ErrorPagesFacade.php
1411
-
1512
message: '#Argument of an invalid type Symfony\\Component\\Validator\\Constraint supplied for foreach, only iterables are supported\.#'
1613
path: %currentWorkingDirectory%/src/Form/JsFormValidatorFactory.php

src/Command/GenerateErrorPagesCommand.php

Lines changed: 0 additions & 38 deletions
This file was deleted.

src/Component/AddSentryContextSubscriber.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Sentry\State\Scope;
1010
use Shopsys\FrameworkBundle\Component\Domain\Domain;
1111
use Shopsys\FrameworkBundle\Component\Domain\Exception\NoDomainSelectedException;
12+
use Shopsys\FrameworkBundle\Component\Error\ErrorIdProvider;
1213
use Shopsys\FrameworkBundle\Component\Localization\DisplayTimeZoneProviderInterface;
1314
use Shopsys\FrameworkBundle\Component\Maintenance\MaintenanceModeFacade;
1415
use Shopsys\FrameworkBundle\Model\Customer\User\CurrentCustomerUser;
@@ -26,12 +27,14 @@ class AddSentryContextSubscriber implements EventSubscriberInterface
2627
* @param \Shopsys\FrameworkBundle\Component\Domain\Domain $domain
2728
* @param \Shopsys\FrameworkBundle\Component\Localization\DisplayTimeZoneProviderInterface $displayTimeZoneProvider
2829
* @param \Shopsys\FrameworkBundle\Model\Customer\User\CurrentCustomerUser $currentCustomerUser
30+
* @param \Shopsys\FrameworkBundle\Component\Error\ErrorIdProvider $errorIdProvider
2931
*/
3032
public function __construct(
3133
protected readonly MaintenanceModeFacade $maintenanceModeFacade,
3234
protected readonly Domain $domain,
3335
protected readonly DisplayTimeZoneProviderInterface $displayTimeZoneProvider,
3436
protected readonly CurrentCustomerUser $currentCustomerUser,
37+
protected readonly ErrorIdProvider $errorIdProvider,
3538
) {
3639
}
3740

@@ -59,6 +62,7 @@ public function setSentryContext(): void
5962

6063
configureScope(function (Scope $scope) use ($context): void {
6164
$scope->setContext('Shopsys', $context);
65+
$scope->setTag('errorId', $this->errorIdProvider->getErrorId());
6266
});
6367
}
6468

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Shopsys\FrameworkBundle\Component\Error;
6+
7+
use Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface;
8+
use Symfony\Component\ErrorHandler\Exception\FlattenException;
9+
use Symfony\Component\HttpFoundation\RequestStack;
10+
use Throwable;
11+
use Tracy\BlueScreen;
12+
use Tracy\Debugger;
13+
14+
final class BlueScreenErrorRenderer implements ErrorRendererInterface
15+
{
16+
/**
17+
* @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
18+
* @param \Symfony\Component\ErrorHandler\ErrorRenderer\ErrorRendererInterface $fallbackErrorRenderer
19+
* @param bool $isDebug
20+
*/
21+
public function __construct(
22+
private readonly RequestStack $requestStack,
23+
private readonly ErrorRendererInterface $fallbackErrorRenderer,
24+
private readonly bool $isDebug,
25+
) {
26+
}
27+
28+
/**
29+
* @param \Throwable $exception
30+
* @return \Symfony\Component\ErrorHandler\Exception\FlattenException
31+
*/
32+
public function render(Throwable $exception): FlattenException
33+
{
34+
if ($this->isDebug() === false) {
35+
return $this->fallbackErrorRenderer->render($exception);
36+
}
37+
38+
Debugger::$time = time();
39+
$blueScreen = new BlueScreen();
40+
41+
ob_start();
42+
43+
$blueScreen->render($exception);
44+
45+
$result = ob_get_clean();
46+
47+
return FlattenException::createFromThrowable($exception)->setAsString($result);
48+
}
49+
50+
/**
51+
* @return bool
52+
*/
53+
private function isDebug(): bool
54+
{
55+
$request = $this->requestStack->getCurrentRequest();
56+
57+
if ($request === null) {
58+
return $this->isDebug;
59+
}
60+
61+
return $this->isDebug && $request->attributes->getBoolean('showException', true);
62+
}
63+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Shopsys\FrameworkBundle\Component\Error;
6+
7+
use Monolog\LogRecord;
8+
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
9+
use Symfony\Component\HttpKernel\KernelEvents;
10+
use Symfony\Contracts\Service\ResetInterface;
11+
12+
final class ErrorIdLogProcessor implements EventSubscriberInterface, ResetInterface
13+
{
14+
private ?string $errorId = null;
15+
16+
/**
17+
* @param \Shopsys\FrameworkBundle\Component\Error\ErrorIdProvider $errorIdProvider
18+
*/
19+
public function __construct(
20+
private readonly ErrorIdProvider $errorIdProvider,
21+
) {
22+
}
23+
24+
/**
25+
* @param \Monolog\LogRecord $record
26+
* @return \Monolog\LogRecord
27+
*/
28+
public function __invoke(LogRecord $record): LogRecord
29+
{
30+
if ($this->errorId !== null) {
31+
$record['extra']['errorId'] = $this->errorId;
32+
}
33+
34+
return $record;
35+
}
36+
37+
public function onException(): void
38+
{
39+
$this->errorId = $this->errorIdProvider->getErrorId();
40+
}
41+
42+
public function reset(): void
43+
{
44+
$this->errorId = null;
45+
}
46+
47+
/**
48+
* {@inheritdoc}
49+
*/
50+
public static function getSubscribedEvents(): array
51+
{
52+
return [
53+
KernelEvents::EXCEPTION => ['onException', 1],
54+
];
55+
}
56+
}

src/Component/Error/ErrorIdProvider.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66

77
use Shopsys\FrameworkBundle\Component\String\HashGenerator;
88

9-
class ErrorIdProvider
9+
final class ErrorIdProvider
1010
{
11-
protected ?string $errorId = null;
11+
private ?string $errorId = null;
1212

1313
/**
1414
* @param \Shopsys\FrameworkBundle\Component\String\HashGenerator $hashGenerator
1515
*/
16-
public function __construct(protected readonly HashGenerator $hashGenerator)
16+
public function __construct(private readonly HashGenerator $hashGenerator)
1717
{
1818
}
1919

src/Component/Error/ErrorPageCronModule.php

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)