Skip to content

Commit f1040bd

Browse files
authored
Merge pull request #1092 from Slamdunk/builder_new_api
Add migration API for `readonly` classes
2 parents 18ffde8 + 59b291f commit f1040bd

File tree

8 files changed

+179
-30
lines changed

8 files changed

+179
-30
lines changed

docs/configuration.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ $configuration = Configuration::forSymmetricSigner(
136136
InMemory::base64Encoded('mBC5v1sOKVvbdEitdSBenu59nfNfhwkedkJVNabosTw=')
137137
);
138138

139-
$configuration->setBuilderFactory(
139+
$configuration = $configuration->withBuilderFactory(
140140
static function (ClaimsFormatter $formatter): Builder {
141141
// This assumes `MyCustomBuilder` is an existing class
142142
return new MyCustomBuilder(new JoseEncoder(), $formatter);
@@ -165,7 +165,7 @@ $configuration = Configuration::forSymmetricSigner(
165165
);
166166

167167
// This assumes `MyParser` is an existing class
168-
$configuration->setParser(new MyParser());
168+
$configuration = $configuration->withParser(new MyParser());
169169
```
170170

171171
### Validator
@@ -189,7 +189,7 @@ $configuration = Configuration::forSymmetricSigner(
189189
);
190190

191191
// This assumes `MyValidator` is an existing class
192-
$configuration->setValidator(new MyValidator());
192+
$configuration = $configuration->withValidator(new MyValidator());
193193
```
194194

195195
### Validation constraints
@@ -216,7 +216,7 @@ $configuration = Configuration::forSymmetricSigner(
216216
InMemory::base64Encoded('mBC5v1sOKVvbdEitdSBenu59nfNfhwkedkJVNabosTw=')
217217
);
218218

219-
$configuration->setValidationConstraints(
219+
$configuration = $configuration->withValidationConstraints(
220220
new SignedWith($configuration->signer(), $configuration->signingKey()),
221221
new StrictValidAt(SystemClock::fromUTC()),
222222
new IssuedBy('https://api.my-awesome-company.com')

docs/extending-the-library.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use Lcobucci\JWT\Configuration;
3232
$config = $container->get(Configuration::class);
3333
assert($config instanceof Configuration);
3434

35-
$config->setBuilderFactory(
35+
$configuration = $configuration->withBuilderFactory(
3636
static function (ClaimsFormatter $formatter): Builder {
3737
return new MyCustomTokenBuilder($formatter);
3838
}
@@ -99,7 +99,7 @@ use Lcobucci\JWT\Configuration;
9999
$config = $container->get(Configuration::class);
100100
assert($config instanceof Configuration);
101101

102-
$config->setParser(new MyCustomTokenParser());
102+
$configuration = $configuration->withParser(new MyCustomTokenParser());
103103
```
104104

105105
## Signer
@@ -157,7 +157,7 @@ use Lcobucci\JWT\Configuration;
157157
$config = $container->get(Configuration::class);
158158
assert($config instanceof Configuration);
159159

160-
$config->setValidator(new MyCustomTokenValidator());
160+
$configuration = $configuration->withValidator(new MyCustomTokenValidator());
161161
```
162162

163163
## Validation constraints

docs/issuing-tokens.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use Lcobucci\JWT\Token\Builder;
1414

1515
require 'vendor/autoload.php';
1616

17-
$tokenBuilder = (new Builder(new JoseEncoder(), ChainedFormatter::default()));
17+
$tokenBuilder = Builder::new(new JoseEncoder(), ChainedFormatter::default());
1818
$algorithm = new Sha256();
1919
$signingKey = InMemory::plainText(random_bytes(32));
2020

@@ -58,7 +58,7 @@ use Lcobucci\JWT\Token\Builder;
5858

5959
require 'vendor/autoload.php';
6060

61-
$tokenBuilder = (new Builder(new JoseEncoder(), ChainedFormatter::default()));
61+
$tokenBuilder = Builder::new(new JoseEncoder(), ChainedFormatter::default());
6262
$algorithm = new Sha256();
6363
$signingKey = InMemory::plainText(random_bytes(32));
6464

src/Configuration.php

Lines changed: 91 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,21 +24,29 @@ final class Configuration
2424
private Closure $builderFactory;
2525

2626
/** @var Constraint[] */
27-
private array $validationConstraints = [];
27+
private array $validationConstraints;
2828

29+
/** @param Closure(ClaimsFormatter $claimFormatter): Builder|null $builderFactory */
2930
private function __construct(
3031
private readonly Signer $signer,
3132
private readonly Key $signingKey,
3233
private readonly Key $verificationKey,
33-
Encoder $encoder,
34-
Decoder $decoder,
34+
private readonly Encoder $encoder,
35+
private readonly Decoder $decoder,
36+
?Parser $parser,
37+
?Validator $validator,
38+
?Closure $builderFactory,
39+
Constraint ...$validationConstraints,
3540
) {
36-
$this->parser = new Token\Parser($decoder);
37-
$this->validator = new Validation\Validator();
41+
$this->parser = $parser ?? new Token\Parser($decoder);
42+
$this->validator = $validator ?? new Validation\Validator();
3843

39-
$this->builderFactory = static function (ClaimsFormatter $claimFormatter) use ($encoder): Builder {
40-
return new Token\Builder($encoder, $claimFormatter);
41-
};
44+
$this->builderFactory = $builderFactory
45+
?? static function (ClaimsFormatter $claimFormatter) use ($encoder): Builder {
46+
return Token\Builder::new($encoder, $claimFormatter);
47+
};
48+
49+
$this->validationConstraints = $validationConstraints;
4250
}
4351

4452
public static function forAsymmetricSigner(
@@ -54,6 +62,9 @@ public static function forAsymmetricSigner(
5462
$verificationKey,
5563
$encoder,
5664
$decoder,
65+
null,
66+
null,
67+
null,
5768
);
5869
}
5970

@@ -69,15 +80,38 @@ public static function forSymmetricSigner(
6980
$key,
7081
$encoder,
7182
$decoder,
83+
null,
84+
null,
85+
null,
7286
);
7387
}
7488

75-
/** @param callable(ClaimsFormatter): Builder $builderFactory */
89+
/**
90+
* @deprecated Deprecated since v5.5, please use {@see self::withBuilderFactory()} instead
91+
*
92+
* @param callable(ClaimsFormatter): Builder $builderFactory
93+
*/
7694
public function setBuilderFactory(callable $builderFactory): void
7795
{
7896
$this->builderFactory = $builderFactory(...);
7997
}
8098

99+
/** @param callable(ClaimsFormatter): Builder $builderFactory */
100+
public function withBuilderFactory(callable $builderFactory): self
101+
{
102+
return new self(
103+
$this->signer,
104+
$this->signingKey,
105+
$this->verificationKey,
106+
$this->encoder,
107+
$this->decoder,
108+
$this->parser,
109+
$this->validator,
110+
$builderFactory(...),
111+
...$this->validationConstraints,
112+
);
113+
}
114+
81115
public function builder(?ClaimsFormatter $claimFormatter = null): Builder
82116
{
83117
return ($this->builderFactory)($claimFormatter ?? ChainedFormatter::default());
@@ -88,11 +122,27 @@ public function parser(): Parser
88122
return $this->parser;
89123
}
90124

125+
/** @deprecated Deprecated since v5.5, please use {@see self::withParser()} instead */
91126
public function setParser(Parser $parser): void
92127
{
93128
$this->parser = $parser;
94129
}
95130

131+
public function withParser(Parser $parser): self
132+
{
133+
return new self(
134+
$this->signer,
135+
$this->signingKey,
136+
$this->verificationKey,
137+
$this->encoder,
138+
$this->decoder,
139+
$parser,
140+
$this->validator,
141+
$this->builderFactory,
142+
...$this->validationConstraints,
143+
);
144+
}
145+
96146
public function signer(): Signer
97147
{
98148
return $this->signer;
@@ -113,19 +163,51 @@ public function validator(): Validator
113163
return $this->validator;
114164
}
115165

166+
/** @deprecated Deprecated since v5.5, please use {@see self::withValidator()} instead */
116167
public function setValidator(Validator $validator): void
117168
{
118169
$this->validator = $validator;
119170
}
120171

172+
public function withValidator(Validator $validator): self
173+
{
174+
return new self(
175+
$this->signer,
176+
$this->signingKey,
177+
$this->verificationKey,
178+
$this->encoder,
179+
$this->decoder,
180+
$this->parser,
181+
$validator,
182+
$this->builderFactory,
183+
...$this->validationConstraints,
184+
);
185+
}
186+
121187
/** @return Constraint[] */
122188
public function validationConstraints(): array
123189
{
124190
return $this->validationConstraints;
125191
}
126192

193+
/** @deprecated Deprecated since v5.5, please use {@see self::withValidationConstraints()} instead */
127194
public function setValidationConstraints(Constraint ...$validationConstraints): void
128195
{
129196
$this->validationConstraints = $validationConstraints;
130197
}
198+
199+
public function withValidationConstraints(Constraint ...$validationConstraints): self
200+
{
201+
return new self(
202+
$this->signer,
203+
$this->signingKey,
204+
$this->verificationKey,
205+
$this->encoder,
206+
$this->decoder,
207+
$this->parser,
208+
$this->validator,
209+
$this->builderFactory,
210+
...$validationConstraints,
211+
);
212+
}
131213
}

src/JwtFacade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function issue(
3838
Key $signingKey,
3939
Closure $customiseBuilder,
4040
): UnencryptedToken {
41-
$builder = new Token\Builder(new JoseEncoder(), ChainedFormatter::withUnixTimestampDates());
41+
$builder = Token\Builder::new(new JoseEncoder(), ChainedFormatter::withUnixTimestampDates());
4242

4343
$now = $this->clock->now();
4444
$builder = $builder

src/Token/Builder.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,16 @@ final class Builder implements BuilderInterface
2525
/** @var array<non-empty-string, mixed> */
2626
private array $claims = [];
2727

28+
/** @deprecated Deprecated since v5.5, please use {@see self::new()} instead */
2829
public function __construct(private readonly Encoder $encoder, private readonly ClaimsFormatter $claimFormatter)
2930
{
3031
}
3132

33+
public static function new(Encoder $encoder, ClaimsFormatter $claimFormatter): self
34+
{
35+
return new self($encoder, $claimFormatter);
36+
}
37+
3238
/**
3339
* @inheritDoc
3440
* @pure

0 commit comments

Comments
 (0)