Skip to content

Commit c974049

Browse files
committed
Improve performance of IconServiceProvider
1 parent 0a93aed commit c974049

File tree

6 files changed

+622
-592
lines changed

6 files changed

+622
-592
lines changed

resources/icons/aliases.php

Lines changed: 529 additions & 518 deletions
Large diffs are not rendered by default.

scripts/copyicons.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,17 @@
4242
$aliasesPhp = <<<PHP
4343
<?php
4444
45-
use CraftCms\Aliases\Aliases;
45+
use Yiisoft\Aliases\Aliases;
4646
47+
\$aliases = app(Aliases::class);
48+
49+
/**
50+
* We use reflection here as calling ->set every
51+
* time incurs a high performance cost.
52+
*/
53+
\$reflectionProperty = new ReflectionProperty(\$aliases, 'aliases');
54+
\$reflectionProperty->setValue(\$aliases, array_merge_recursive(\$reflectionProperty->getValue(\$aliases), [
55+
'@appicons' => [
4756
4857
PHP;
4958

@@ -81,7 +90,7 @@
8190
if ($style !== 'custom') {
8291
$terms = $meta[$name]['search']['terms'] ?? [];
8392
$index[$name] = [
84-
'name' => sprintf(' %s ', Search::normalizeKeywords($name, language: 'en-US')),
93+
'name' => sprintf(' %s ', Search::normalizeKeywords((string) $name, language: 'en-US')),
8594
'terms' => sprintf(' %s ', Search::normalizeKeywords($terms, language: 'en-US')),
8695
'pro' => empty($meta[$name]['free']),
8796
'styles' => $meta[$name]['styles'] ?? [],
@@ -90,12 +99,17 @@
9099

91100
if ($style !== 'solid') {
92101
$aliasesPhp .= <<<PHP
93-
Aliases::set('@appicons/$name.svg', "@icons/$dir/$name.svg");
102+
'@appicons/$name.svg' => "@icons/$dir/$name.svg",
94103
95104
PHP;
96105
}
97106
}
98107

108+
$aliasesPhp .= <<<'PHP'
109+
]
110+
]));
111+
PHP;
112+
99113
echo "Finished writing $wrote icons ($skipped skipped).\n";
100114

101115
echo 'Copying LICENSE.txt ... ';

src/Config/GeneralConfig.php

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
use CraftCms\Cms\Support\PHP;
1515
use DateInterval;
1616
use Deprecated;
17-
use Illuminate\Contracts\Config\Repository as ConfigRepository;
1817
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
1918
use Illuminate\Http\Middleware\TrustProxies;
2019
use Illuminate\Http\Request;
@@ -32,17 +31,17 @@ class GeneralConfig extends BaseConfig
3231
{
3332
use Conditionable;
3433

35-
public const IMAGE_DRIVER_AUTO = 'auto';
34+
public const string IMAGE_DRIVER_AUTO = 'auto';
3635

37-
public const IMAGE_DRIVER_GD = 'gd';
36+
public const string IMAGE_DRIVER_GD = 'gd';
3837

39-
public const IMAGE_DRIVER_IMAGICK = 'imagick';
38+
public const string IMAGE_DRIVER_IMAGICK = 'imagick';
4039

41-
public const CAMEL_CASE = 'camel';
40+
public const string CAMEL_CASE = 'camel';
4241

43-
public const PASCAL_CASE = 'pascal';
42+
public const string PASCAL_CASE = 'pascal';
4443

45-
public const SNAKE_CASE = 'snake';
44+
public const string SNAKE_CASE = 'snake';
4645

4746
protected static array $renamedSettings = [
4847
'activateAccountFailurePath' => 'invalidUserTokenPath',
@@ -3856,7 +3855,7 @@ public function backupCommandFormat(string $value): self
38563855
public function blowfishHashCost(int $value): self
38573856
{
38583857
app()->booting(function () use ($value) {
3859-
config()->set('hashing.bcrypt.rounds', $value);
3858+
Config::set('hashing.bcrypt.rounds', $value);
38603859
Deprecator::log('generalConfig.blowfishHashCost', 'blowfishHashCost is deprecated. Set hashing.bcrypt.rounds or BCRYPT_ROUNDS instead.');
38613860
});
38623861

@@ -4081,7 +4080,10 @@ public function defaultCookieDomain(string $value): self
40814080
{
40824081
$this->defaultCookieDomain = $value;
40834082

4084-
config()->set('session.domain', $value);
4083+
app()->booting(function () use ($value) {
4084+
Deprecator::log('generalConfig.defaultCookieDomain', 'Calling defaultCookieDomain() is deprecated.');
4085+
Config::set('session.domain', $value);
4086+
});
40854087

40864088
return $this;
40874089
}
@@ -4359,12 +4361,13 @@ public function deferPublicRegistrationPassword(bool $value = true): self
43594361
#[Deprecated(message: 'in 6.0.0. Set `app.debug` or `APP_DEBUG` environment variable instead.')]
43604362
public function devMode(bool $value = true): self
43614363
{
4362-
app()->booting(fn () => Deprecator::log('generalConfig.devMode', 'devMode is deprecated. Set `app.debug` or `APP_DEBUG` environment variable instead.'));
4364+
app()->booting(function () use ($value) {
4365+
Deprecator::log('generalConfig.devMode', 'devMode is deprecated. Set `app.debug` or `APP_DEBUG` environment variable instead.');
4366+
Config::set('app.debug', $value);
4367+
});
43634368

43644369
$this->devMode = $value;
43654370

4366-
config()->set('app.debug', $value);
4367-
43684371
return $this;
43694372
}
43704373

@@ -5668,11 +5671,12 @@ public function phpMaxMemoryLimit(?string $value): self
56685671
#[Deprecated(message: 'in 6.0.0. Configure `session.cookie` or set `SESSION_COOKIE` environment variable.')]
56695672
public function phpSessionName(string $value): self
56705673
{
5671-
app()->booting(fn () => Deprecator::log('generalConfig.phpSessionName', 'Calling phpSessionName() is deprecated. Configure `session.cookie` or set `SESSION_COOKIE` environment variable.'));
5672-
56735674
$this->phpSessionName = $value;
56745675

5675-
config()->set('session.cookie', $value);
5676+
app()->booting(function () use ($value) {
5677+
Deprecator::log('generalConfig.phpSessionName', 'Calling phpSessionName() is deprecated. Configure `session.cookie` or set `SESSION_COOKIE` environment variable.');
5678+
Config::set('session.cookie', $value);
5679+
});
56765680

56775681
return $this;
56785682
}
@@ -6079,12 +6083,9 @@ public function rememberedUserSessionDuration(mixed $value): self
60796083
$this->rememberedUserSessionDuration = $interval ? ConfigHelper::durationInSeconds($interval) : 0;
60806084
$this->_rememberedUserSessionDuration = $interval ?: null;
60816085

6082-
if (app()->has(ConfigRepository::class)) {
6083-
app()->get(ConfigRepository::class)->set(
6084-
'auth.guards.web.remember',
6085-
floor($this->rememberedUserSessionDuration / 60),
6086-
);
6087-
}
6086+
app()->booting(function () {
6087+
Config::set('auth.guards.web.remember', floor($this->rememberedUserSessionDuration / 60));
6088+
});
60886089

60896090
return $this;
60906091
}
@@ -6494,11 +6495,12 @@ public function secureProtocolHeaders(?array $value): self
64946495
#[Deprecated(message: 'in 6.0.0. Configure `app.key` or set `APP_KEY` in your environment instead.')]
64956496
public function securityKey(string $value): self
64966497
{
6497-
app()->booting(fn () => Deprecator::log('generalConfig.securityKey', 'Calling securityKey() is deprecated.'));
6498-
64996498
$this->securityKey = $value;
65006499

6501-
config()->set('app.key', $value);
6500+
app()->booting(function () use ($value) {
6501+
Deprecator::log('generalConfig.securityKey', 'Calling securityKey() is deprecated.');
6502+
Config::set('app.key', $value);
6503+
});
65026504

65036505
return $this;
65046506
}
@@ -6794,9 +6796,10 @@ public function testToEmailAddress(string|array|null|false $value): self
67946796
#[Deprecated(message: "in 6.0.0. Laravel's `app.timezone` config variable should be used instead.")]
67956797
public function timezone(?string $value): self
67966798
{
6797-
config()->set('app.timezone', $value);
6798-
6799-
app()->booting(fn () => Deprecator::log('generalConfig.timezone', 'Calling timezone() is deprecated. Laravel\'s `app.timezone` config variable should be used instead.'));
6799+
app()->booting(function () use ($value) {
6800+
Deprecator::log('generalConfig.timezone', 'Calling timezone() is deprecated. Laravel\'s `app.timezone` config variable should be used instead.');
6801+
Config::set('app.timezone', $value);
6802+
});
68006803

68016804
$this->timezone = $value;
68026805

@@ -7062,9 +7065,10 @@ public function usePathInfo(bool $value = true): self
70627065
#[Deprecated(message: 'in 6.0.0. Configure `session.secure` or set `SESSION_SECURE_COOKIE` in your environment instead.')]
70637066
public function useSecureCookies(string|bool $value): self
70647067
{
7065-
app()->booting(fn () => Deprecator::log('generalConfig.useSecureCookies', 'Calling useSecureCookies() is deprecated. Configure `session.secure` or set `SESSION_SECURE_COOKIE` in your environment instead.'));
7066-
7067-
config()->set('session.secure', $value === 'auto' ? null : $value);
7068+
app()->booting(function () use ($value) {
7069+
Deprecator::log('generalConfig.useSecureCookies', 'Calling useSecureCookies() is deprecated. Configure `session.secure` or set `SESSION_SECURE_COOKIE` in your environment instead.');
7070+
Config::set('session.secure', $value === 'auto' ? null : $value);
7071+
});
70687072

70697073
$this->useSecureCookies = $value;
70707074

src/Console/ConsoleServiceProvider.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
use CraftCms\Cms\Console\Commands\Utils\DeleteEmptyVolumeFoldersCommand;
2323
use CraftCms\Cms\Console\Commands\Utils\UpdateUsernamesCommand;
2424
use CraftCms\Cms\GarbageCollection\Commands\RunCommand;
25+
use CraftCms\Cms\ProjectConfig\ProjectConfig;
2526
use Illuminate\Support\ServiceProvider;
2627

2728
/**
@@ -66,7 +67,7 @@ public function boot(): void
6667
}
6768

6869
$this->app->terminating(function () {
69-
app('Craft')->getProjectConfig()->flush();
70+
$this->app->make(ProjectConfig::class)->flush();
7071
});
7172

7273
$this->commands($this->commands);

src/Providers/IconServiceProvider.php

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,58 +4,58 @@
44

55
namespace CraftCms\Cms\Providers;
66

7-
use CraftCms\Aliases\Aliases;
87
use Illuminate\Support\ServiceProvider;
8+
use Yiisoft\Aliases\Aliases as YiiAliases;
99

1010
final class IconServiceProvider extends ServiceProvider
1111
{
12-
public function boot(): void
12+
public function boot(YiiAliases $aliases): void
1313
{
14-
Aliases::set('@icons', '@craftcms/resources/icons');
15-
Aliases::set('@appicons', '@icons/solid');
14+
$aliases->set('@icons', '@craftcms/resources/icons');
15+
$aliases->set('@appicons', '@icons/solid');
1616

1717
$customIconsPath = '@icons/custom-icons';
1818

1919
// Icons
20-
Aliases::set('@appicons/c-debug.svg', "$customIconsPath/c-debug.svg");
21-
Aliases::set('@appicons/c-outline.svg', "$customIconsPath/c-outline.svg");
22-
Aliases::set('@appicons/craft-cms.svg', "$customIconsPath/craft-cms.svg");
23-
Aliases::set('@appicons/craft-partners.svg', "$customIconsPath/craft-partners.svg");
24-
Aliases::set('@appicons/craft-stack-exchange.svg', "$customIconsPath/craft-stack-exchange.svg");
25-
Aliases::set('@appicons/default-plugin.svg', "$customIconsPath/default-plugin.svg");
26-
Aliases::set('@appicons/grip-dots.svg', "$customIconsPath/grip-dots.svg");
20+
$aliases->set('@appicons/c-debug.svg', "$customIconsPath/c-debug.svg");
21+
$aliases->set('@appicons/c-outline.svg', "$customIconsPath/c-outline.svg");
22+
$aliases->set('@appicons/craft-cms.svg', "$customIconsPath/craft-cms.svg");
23+
$aliases->set('@appicons/craft-partners.svg', "$customIconsPath/craft-partners.svg");
24+
$aliases->set('@appicons/craft-stack-exchange.svg', "$customIconsPath/craft-stack-exchange.svg");
25+
$aliases->set('@appicons/default-plugin.svg', "$customIconsPath/default-plugin.svg");
26+
$aliases->set('@appicons/grip-dots.svg', "$customIconsPath/grip-dots.svg");
2727

28-
require Aliases::get('@icons/aliases.php');
28+
require $aliases->get('@icons/aliases.php');
2929

3030
$solidIconsPath = '@icons/solid';
3131

3232
// Renamed icon aliases
33-
Aliases::set('@appicons/alert.svg', "$solidIconsPath/triangle-exclamation.svg");
34-
Aliases::set('@appicons/broken-image', "$solidIconsPath/image-slash.svg");
35-
Aliases::set('@appicons/buoey.svg', "$solidIconsPath/life-ring.svg");
36-
Aliases::set('@appicons/draft.svg', "$solidIconsPath/scribble.svg");
37-
Aliases::set('@appicons/entry-types', "$solidIconsPath/files.svg");
38-
Aliases::set('@appicons/excite.svg', "$solidIconsPath/certificate.svg");
39-
Aliases::set('@appicons/feed.svg', "$solidIconsPath/rss.svg");
40-
Aliases::set('@appicons/field.svg', "$solidIconsPath/pen-to-square.svg");
41-
Aliases::set('@appicons/hash.svg', "$solidIconsPath/hashtag.svg");
42-
Aliases::set('@appicons/info-circle', "$solidIconsPath/circle-info.svg");
43-
Aliases::set('@appicons/info-circle.svg', "$solidIconsPath/circle-info.svg");
44-
Aliases::set('@appicons/info.svg', "$solidIconsPath/circle-info.svg");
45-
Aliases::set('@appicons/info.svg', "$solidIconsPath/circle-info.svg");
46-
Aliases::set('@appicons/location.svg', "$solidIconsPath/location-dot.svg");
47-
Aliases::set('@appicons/photo.svg', "$solidIconsPath/image.svg");
48-
Aliases::set('@appicons/plugin.svg', "$solidIconsPath/plug.svg");
49-
Aliases::set('@appicons/routes.svg', "$solidIconsPath/signs-post.svg");
50-
Aliases::set('@appicons/search.svg', "$solidIconsPath/magnifying-glass.svg");
51-
Aliases::set('@appicons/shopping-cart', "$solidIconsPath/cart-shopping.svg");
52-
Aliases::set('@appicons/template.svg', "$solidIconsPath/file-code.svg");
53-
Aliases::set('@appicons/template.svg', "$solidIconsPath/file-code.svg");
54-
Aliases::set('@appicons/tip.svg', "$solidIconsPath/lightbulb.svg");
55-
Aliases::set('@appicons/tools.svg', "$solidIconsPath/screwdriver-wrench.svg");
56-
Aliases::set('@appicons/tree.svg', "$solidIconsPath/sitemap.svg");
57-
Aliases::set('@appicons/upgrade.svg', "$solidIconsPath/square-arrow-up.svg");
58-
Aliases::set('@appicons/wand.svg', "$solidIconsPath/wand-magic-sparkles.svg");
59-
Aliases::set('@appicons/world.svg', "$solidIconsPath/earth-americas.svg");
33+
$aliases->set('@appicons/alert.svg', "$solidIconsPath/triangle-exclamation.svg");
34+
$aliases->set('@appicons/broken-image', "$solidIconsPath/image-slash.svg");
35+
$aliases->set('@appicons/buoey.svg', "$solidIconsPath/life-ring.svg");
36+
$aliases->set('@appicons/draft.svg', "$solidIconsPath/scribble.svg");
37+
$aliases->set('@appicons/entry-types', "$solidIconsPath/files.svg");
38+
$aliases->set('@appicons/excite.svg', "$solidIconsPath/certificate.svg");
39+
$aliases->set('@appicons/feed.svg', "$solidIconsPath/rss.svg");
40+
$aliases->set('@appicons/field.svg', "$solidIconsPath/pen-to-square.svg");
41+
$aliases->set('@appicons/hash.svg', "$solidIconsPath/hashtag.svg");
42+
$aliases->set('@appicons/info-circle', "$solidIconsPath/circle-info.svg");
43+
$aliases->set('@appicons/info-circle.svg', "$solidIconsPath/circle-info.svg");
44+
$aliases->set('@appicons/info.svg', "$solidIconsPath/circle-info.svg");
45+
$aliases->set('@appicons/info.svg', "$solidIconsPath/circle-info.svg");
46+
$aliases->set('@appicons/location.svg', "$solidIconsPath/location-dot.svg");
47+
$aliases->set('@appicons/photo.svg', "$solidIconsPath/image.svg");
48+
$aliases->set('@appicons/plugin.svg', "$solidIconsPath/plug.svg");
49+
$aliases->set('@appicons/routes.svg', "$solidIconsPath/signs-post.svg");
50+
$aliases->set('@appicons/search.svg', "$solidIconsPath/magnifying-glass.svg");
51+
$aliases->set('@appicons/shopping-cart', "$solidIconsPath/cart-shopping.svg");
52+
$aliases->set('@appicons/template.svg', "$solidIconsPath/file-code.svg");
53+
$aliases->set('@appicons/template.svg', "$solidIconsPath/file-code.svg");
54+
$aliases->set('@appicons/tip.svg', "$solidIconsPath/lightbulb.svg");
55+
$aliases->set('@appicons/tools.svg', "$solidIconsPath/screwdriver-wrench.svg");
56+
$aliases->set('@appicons/tree.svg', "$solidIconsPath/sitemap.svg");
57+
$aliases->set('@appicons/upgrade.svg', "$solidIconsPath/square-arrow-up.svg");
58+
$aliases->set('@appicons/wand.svg', "$solidIconsPath/wand-magic-sparkles.svg");
59+
$aliases->set('@appicons/world.svg', "$solidIconsPath/earth-americas.svg");
6060
}
6161
}

src/Twig/TwigMapper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public function map(Throwable $exception): Throwable
3030

3131
$trace = collect($exception->getTrace())
3232
->map(function (array $frame, int $index) use (&$viewIndex) {
33-
$templateInfo = $this->resolveTemplatePathAndLine($frame['file'] ?? '', $frame['line']);
33+
$templateInfo = $this->resolveTemplatePathAndLine($frame['file'] ?? '', $frame['line'] ?? null);
3434

3535
if ($templateInfo !== false) {
3636
[$frame['file'], $frame['line']] = $templateInfo;

0 commit comments

Comments
 (0)