Skip to content

Commit 08a3d3d

Browse files
committed
Replace Stringable|string argument types with string-only
Methods that previously accepted `Stringable|string` as argument types now only support `string`. `Stringable` was added for convenience so that someone could do, for example ```php $user = $auth->getUser('uid'); $auth->updateUser($user, [...]); ``` While convenient, this adds overhead when processing these arguments. For example, if a method expects a non-empty string, the SDK would have to do a `trim((string) $arg)` and check if it's empty. With this change, we can rely only on a `@var non-empty-string $arg` docblock annotation. ```php $user = $auth->getUser('uid'); $auth->updateUser($user->uid, [...]); ```
1 parent afa0109 commit 08a3d3d

20 files changed

+260
-205
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ If it saves you or your team time, please consider [sponsoring its development](
1212
* [Firebase Dynamic Links was shut down on August 25th, 2025](https://firebase.google.com/support/dynamic-links-faq)
1313
and has been removed from the SDK.
1414
* Deprecated classes, methods and class constants have been removed.
15+
* Replaced `Stringable|string` argument types with `string`-only
1516

1617
See **[UPGRADE-8.0](UPGRADE-8.0.md) for more details on the changes between 7.x and 8.0.**
1718

UPGRADE-8.0.md

Lines changed: 120 additions & 4 deletions
Large diffs are not rendered by default.

src/Firebase/Auth.php

Lines changed: 30 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
use Lcobucci\JWT\UnencryptedToken;
4747
use Psr\Clock\ClockInterface;
4848
use Psr\Http\Message\ResponseInterface;
49-
use Stringable;
5049
use Throwable;
5150
use Traversable;
5251

@@ -76,7 +75,7 @@ public function __construct(
7675
$this->jwtParser = new Parser(new JoseEncoder());
7776
}
7877

79-
public function getUser(Stringable|string $uid): UserRecord
78+
public function getUser(string $uid): UserRecord
8079
{
8180
$uid = Uid::fromString($uid)->value;
8281

@@ -91,7 +90,7 @@ public function getUser(Stringable|string $uid): UserRecord
9190

9291
public function getUsers(array $uids): array
9392
{
94-
$uids = array_map(static fn(\Stringable|string $uid): string => Uid::fromString($uid)->value, $uids);
93+
$uids = array_map(static fn(string $uid): string => Uid::fromString($uid)->value, $uids);
9594

9695
$users = array_fill_keys($uids, null);
9796

@@ -161,7 +160,7 @@ public function createUser(array|CreateUser $properties): UserRecord
161160
return $this->getUserRecordFromResponseAfterUserUpdate($response);
162161
}
163162

164-
public function updateUser(Stringable|string $uid, array|UpdateUser $properties): UserRecord
163+
public function updateUser(string $uid, array|UpdateUser $properties): UserRecord
165164
{
166165
$request = $properties instanceof UpdateUser
167166
? $properties
@@ -174,7 +173,7 @@ public function updateUser(Stringable|string $uid, array|UpdateUser $properties)
174173
return $this->getUserRecordFromResponseAfterUserUpdate($response);
175174
}
176175

177-
public function createUserWithEmailAndPassword(Stringable|string $email, Stringable|string $password): UserRecord
176+
public function createUserWithEmailAndPassword(string $email, string $password): UserRecord
178177
{
179178
return $this->createUser(
180179
CreateUser::new()
@@ -183,9 +182,9 @@ public function createUserWithEmailAndPassword(Stringable|string $email, Stringa
183182
);
184183
}
185184

186-
public function getUserByEmail(Stringable|string $email): UserRecord
185+
public function getUserByEmail(string $email): UserRecord
187186
{
188-
$email = Email::fromString((string) $email)->value;
187+
$email = Email::fromString($email)->value;
189188

190189
$response = $this->client->getUserByEmail($email);
191190

@@ -198,10 +197,8 @@ public function getUserByEmail(Stringable|string $email): UserRecord
198197
return $userRecord;
199198
}
200199

201-
public function getUserByPhoneNumber(Stringable|string $phoneNumber): UserRecord
200+
public function getUserByPhoneNumber(string $phoneNumber): UserRecord
202201
{
203-
$phoneNumber = (string) $phoneNumber;
204-
205202
$response = $this->client->getUserByPhoneNumber($phoneNumber);
206203

207204
$userRecord = self::getFirstUserRecordFromUserListResponse($response);
@@ -213,11 +210,8 @@ public function getUserByPhoneNumber(Stringable|string $phoneNumber): UserRecord
213210
return $userRecord;
214211
}
215212

216-
public function getUserByProviderUid(Stringable|string $providerId, Stringable|string $providerUid): UserRecord
213+
public function getUserByProviderUid(string $providerId, string $providerUid): UserRecord
217214
{
218-
$providerId = (string) $providerId;
219-
$providerUid = (string) $providerUid;
220-
221215
$response = $this->client->getUserByProviderUid($providerId, $providerUid);
222216

223217
$userRecord = self::getFirstUserRecordFromUserListResponse($response);
@@ -234,27 +228,27 @@ public function createAnonymousUser(): UserRecord
234228
return $this->createUser(CreateUser::new());
235229
}
236230

237-
public function changeUserPassword(Stringable|string $uid, Stringable|string $newPassword): UserRecord
231+
public function changeUserPassword(string $uid, string $newPassword): UserRecord
238232
{
239233
return $this->updateUser($uid, UpdateUser::new()->withClearTextPassword($newPassword));
240234
}
241235

242-
public function changeUserEmail(Stringable|string $uid, Stringable|string $newEmail): UserRecord
236+
public function changeUserEmail(string $uid, string $newEmail): UserRecord
243237
{
244238
return $this->updateUser($uid, UpdateUser::new()->withEmail($newEmail));
245239
}
246240

247-
public function enableUser(Stringable|string $uid): UserRecord
241+
public function enableUser(string $uid): UserRecord
248242
{
249243
return $this->updateUser($uid, UpdateUser::new()->markAsEnabled());
250244
}
251245

252-
public function disableUser(Stringable|string $uid): UserRecord
246+
public function disableUser(string $uid): UserRecord
253247
{
254248
return $this->updateUser($uid, UpdateUser::new()->markAsDisabled());
255249
}
256250

257-
public function deleteUser(Stringable|string $uid): void
251+
public function deleteUser(string $uid): void
258252
{
259253
$uid = Uid::fromString($uid)->value;
260254

@@ -277,9 +271,9 @@ public function deleteUsers(iterable $uids, bool $forceDeleteEnabledUsers = fals
277271
return DeleteUsersResult::fromRequestAndResponse($request, $response);
278272
}
279273

280-
public function getEmailActionLink(string $type, Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): string
274+
public function getEmailActionLink(string $type, string $email, $actionCodeSettings = null, ?string $locale = null): string
281275
{
282-
$email = Email::fromString((string) $email)->value;
276+
$email = Email::fromString($email)->value;
283277

284278
if ($actionCodeSettings === null) {
285279
$actionCodeSettings = ValidatedActionCodeSettings::empty();
@@ -292,9 +286,9 @@ public function getEmailActionLink(string $type, Stringable|string $email, $acti
292286
return $this->client->getEmailActionLink($type, $email, $actionCodeSettings, $locale);
293287
}
294288

295-
public function sendEmailActionLink(string $type, Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): void
289+
public function sendEmailActionLink(string $type, string $email, $actionCodeSettings = null, ?string $locale = null): void
296290
{
297-
$email = Email::fromString((string) $email)->value;
291+
$email = Email::fromString($email)->value;
298292

299293
if ($actionCodeSettings === null) {
300294
$actionCodeSettings = ValidatedActionCodeSettings::empty();
@@ -330,45 +324,45 @@ public function sendEmailActionLink(string $type, Stringable|string $email, $act
330324
$this->client->sendEmailActionLink($type, $email, $actionCodeSettings, $locale, $idToken);
331325
}
332326

333-
public function getEmailVerificationLink(Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): string
327+
public function getEmailVerificationLink(string $email, $actionCodeSettings = null, ?string $locale = null): string
334328
{
335329
return $this->getEmailActionLink('VERIFY_EMAIL', $email, $actionCodeSettings, $locale);
336330
}
337331

338-
public function sendEmailVerificationLink(Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): void
332+
public function sendEmailVerificationLink(string $email, $actionCodeSettings = null, ?string $locale = null): void
339333
{
340334
$this->sendEmailActionLink('VERIFY_EMAIL', $email, $actionCodeSettings, $locale);
341335
}
342336

343-
public function getPasswordResetLink(Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): string
337+
public function getPasswordResetLink(string $email, $actionCodeSettings = null, ?string $locale = null): string
344338
{
345339
return $this->getEmailActionLink('PASSWORD_RESET', $email, $actionCodeSettings, $locale);
346340
}
347341

348-
public function sendPasswordResetLink(Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): void
342+
public function sendPasswordResetLink(string $email, $actionCodeSettings = null, ?string $locale = null): void
349343
{
350344
$this->sendEmailActionLink('PASSWORD_RESET', $email, $actionCodeSettings, $locale);
351345
}
352346

353-
public function getSignInWithEmailLink(Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): string
347+
public function getSignInWithEmailLink(string $email, $actionCodeSettings = null, ?string $locale = null): string
354348
{
355349
return $this->getEmailActionLink('EMAIL_SIGNIN', $email, $actionCodeSettings, $locale);
356350
}
357351

358-
public function sendSignInWithEmailLink(Stringable|string $email, $actionCodeSettings = null, ?string $locale = null): void
352+
public function sendSignInWithEmailLink(string $email, $actionCodeSettings = null, ?string $locale = null): void
359353
{
360354
$this->sendEmailActionLink('EMAIL_SIGNIN', $email, $actionCodeSettings, $locale);
361355
}
362356

363-
public function setCustomUserClaims(Stringable|string $uid, ?array $claims): void
357+
public function setCustomUserClaims(string $uid, ?array $claims): void
364358
{
365359
$uid = Uid::fromString($uid)->value;
366360
$claims ??= [];
367361

368362
$this->client->setCustomUserClaims($uid, $claims);
369363
}
370364

371-
public function createCustomToken(Stringable|string $uid, array $claims = [], $ttl = 3600): UnencryptedToken
365+
public function createCustomToken(string $uid, array $claims = [], $ttl = 3600): UnencryptedToken
372366
{
373367
if ($this->tokenGenerator === null) {
374368
throw new AuthError('Custom Token Generation is disabled because the current credentials do not permit it');
@@ -507,7 +501,7 @@ public function confirmPasswordReset(string $oobCode, $newPassword, bool $invali
507501
return $email;
508502
}
509503

510-
public function revokeRefreshTokens(Stringable|string $uid): void
504+
public function revokeRefreshTokens(string $uid): void
511505
{
512506
$uid = Uid::fromString($uid)->value;
513507

@@ -518,12 +512,7 @@ public function unlinkProvider($uid, $provider): UserRecord
518512
{
519513
$uid = Uid::fromString($uid)->value;
520514

521-
$provider = array_values(
522-
array_filter(
523-
array_map(strval(...), (array) $provider),
524-
static fn(string $value): bool => $value !== '',
525-
),
526-
);
515+
$provider = array_map(strval(...), (array) $provider);
527516

528517
$response = $this->client->unlinkProvider($uid, $provider);
529518

@@ -533,7 +522,7 @@ public function unlinkProvider($uid, $provider): UserRecord
533522
public function signInAsUser($user, ?array $claims = null): SignInResult
534523
{
535524
$claims ??= [];
536-
$uid = $user instanceof UserRecord ? $user->uid : (string) $user;
525+
$uid = $user instanceof UserRecord ? $user->uid : $user;
537526

538527
try {
539528
$customToken = $this->createCustomToken($uid, $claims);
@@ -560,15 +549,15 @@ public function signInWithRefreshToken(string $refreshToken): SignInResult
560549

561550
public function signInWithEmailAndPassword($email, $clearTextPassword): SignInResult
562551
{
563-
$email = Email::fromString((string) $email)->value;
552+
$email = Email::fromString($email)->value;
564553
$clearTextPassword = ClearTextPassword::fromString($clearTextPassword)->value;
565554

566555
return $this->client->handleSignIn(SignInWithEmailAndPassword::fromValues($email, $clearTextPassword));
567556
}
568557

569558
public function signInWithEmailAndOobCode($email, string $oobCode): SignInResult
570559
{
571-
$email = Email::fromString((string) $email)->value;
560+
$email = Email::fromString($email)->value;
572561

573562
return $this->client->handleSignIn(SignInWithEmailAndOobCode::fromValues($email, $oobCode));
574563
}
@@ -591,7 +580,6 @@ public function signInAnonymously(): SignInResult
591580

592581
public function signInWithIdpAccessToken($provider, string $accessToken, $redirectUrl = null, ?string $oauthTokenSecret = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult
593582
{
594-
$provider = (string) $provider;
595583
$redirectUrl = trim((string) ($redirectUrl ?? 'http://localhost'));
596584
$linkingIdToken = trim((string) $linkingIdToken);
597585
$oauthTokenSecret = trim((string) $oauthTokenSecret);
@@ -620,7 +608,6 @@ public function signInWithIdpAccessToken($provider, string $accessToken, $redire
620608

621609
public function signInWithIdpIdToken($provider, $idToken, $redirectUrl = null, ?string $linkingIdToken = null, ?string $rawNonce = null): SignInResult
622610
{
623-
$provider = trim((string) $provider);
624611
$redirectUrl = trim((string) ($redirectUrl ?? 'http://localhost'));
625612
$linkingIdToken = trim((string) $linkingIdToken);
626613
$rawNonce = trim((string) $rawNonce);

src/Firebase/Auth/ApiClient.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
use Kreait\Firebase\Request\UpdateUser;
2121
use Psr\Clock\ClockInterface;
2222
use Psr\Http\Message\ResponseInterface;
23-
use Stringable;
2423
use Throwable;
2524

2625
use function array_filter;
@@ -239,7 +238,7 @@ public function revokeRefreshTokens(string $uid): ResponseInterface
239238
}
240239

241240
/**
242-
* @param list<Stringable|non-empty-string> $providers
241+
* @param list<non-empty-string> $providers
243242
*
244243
* @throws AuthException
245244
*/

src/Firebase/Auth/CreateActionLink.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
namespace Kreait\Firebase\Auth;
66

77
use Kreait\Firebase\Value\Email;
8-
use Stringable;
98

109
/**
1110
* @internal
@@ -21,9 +20,9 @@ private function __construct(
2120
) {
2221
}
2322

24-
public static function new(string $type, Stringable|string $email, ActionCodeSettings $settings, ?string $tenantId = null, ?string $locale = null): self
23+
public static function new(string $type, string $email, ActionCodeSettings $settings, ?string $tenantId = null, ?string $locale = null): self
2524
{
26-
$email = Email::fromString((string) $email)->value;
25+
$email = Email::fromString($email)->value;
2726

2827
return new self($tenantId, $locale, $type, $email, $settings);
2928
}

src/Firebase/Auth/CustomTokenViaGoogleCredentials.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
use Lcobucci\JWT\Encoding\JoseEncoder;
1414
use Lcobucci\JWT\Token;
1515
use Lcobucci\JWT\Token\Parser;
16-
use Stringable;
1716

1817
/**
1918
* @internal
@@ -31,13 +30,15 @@ public function __construct(private SignBlobInterface $signer, private ?string $
3130
}
3231

3332
/**
34-
* @param Stringable|string $uid
33+
* @param non-empty-string $uid
3534
* @param array<non-empty-string, mixed> $claims
3635
*
3736
* @throws AuthError
3837
*/
39-
public function createCustomToken($uid, array $claims = [], ?DateTimeInterface $expiresAt = null): Token
38+
public function createCustomToken(string $uid, ?array $claims = null, ?DateTimeInterface $expiresAt = null): Token
4039
{
40+
$claims ??= [];
41+
4142
$now = new DateTimeImmutable();
4243
$expiresAt = ($expiresAt !== null)
4344
? DT::toUTCDateTimeImmutable($expiresAt)
@@ -50,7 +51,7 @@ public function createCustomToken($uid, array $claims = [], ?DateTimeInterface $
5051
'aud' => 'https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit',
5152
'iat' => $now->getTimestamp(),
5253
'exp' => $expiresAt->getTimestamp(),
53-
'uid' => (string) $uid,
54+
'uid' => $uid,
5455
];
5556

5657
if ($this->tenantId !== null) {

src/Firebase/Auth/DeleteUsersRequest.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
use Kreait\Firebase\Exception\InvalidArgumentException;
88
use Kreait\Firebase\Value\Uid;
9-
use Stringable;
109

1110
/**
1211
* @internal
@@ -23,7 +22,7 @@ private function __construct(
2322
}
2423

2524
/**
26-
* @param iterable<Stringable|string> $uids
25+
* @param iterable<string> $uids
2726
*/
2827
public static function withUids(iterable $uids, bool $forceDeleteEnabledUsers = false): self
2928
{

0 commit comments

Comments
 (0)