
Laravel throw_if() / throw_unless(): Π²ΠΈΠ½ΡΡΠΊΠΈ Π±Π΅Π· Π·Π°ΠΉΠ²ΠΎΠ³ΠΎ if
Π―ΠΊ Π·Π°ΠΌΡΠ½ΠΈΡΠΈ ΠΏΡΠΎΡΡΠΈΠΉ if + throw Π½Π° throw_if() Π°Π±ΠΎ throw_unless(), Π²ΠΈΠ±ΡΠ°ΡΠΈ ΡΠΎΡΠΌΡ Π±Π΅Π· ΠΏΠΎΠ΄Π²ΡΠΉΠ½ΠΎΠ³ΠΎ Π·Π°ΠΏΠ΅ΡΠ΅ΡΠ΅Π½Π½Ρ, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΊΠ»Π°Ρ Π²ΠΈΠ½ΡΡΠΊΡ Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΠ° Π±ΡΠ΄ΡΠ²Π°ΡΠΈ ΡΠΈΡΠ°Π±Π΅Π»ΡΠ½Ρ Π·Π°Ρ ΠΈΡΠ½Ρ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠΈ.
ΠΠ°Ρ
ΠΈΡΠ½Π° ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠ° ΡΠ°ΡΡΠΎ ΠΌΠ°Ρ Π΄ΡΠΆΠ΅ ΠΏΡΠΎΡΡΠΈΠΉ Π·ΠΌΡΡΡ: ΡΠΊΡΠΎ ΡΠΌΠΎΠ²Π° ΠΏΠΎΡΡΡΠ΅Π½Π°, Π²ΠΈΠΊΠΎΠ½Π°Π½Π½Ρ Π½Π΅ ΠΏΠΎΠ²ΠΈΠ½Π½ΠΎ ΠΉΡΠΈ Π΄Π°Π»Ρ. Π£ Π·Π²ΠΈΡΠ°ΠΉΠ½ΠΎΠΌΡ PHP ΡΠ΅ ΠΏΡΠΈΡΠΎΠ΄Π½ΠΎ Π·Π°ΠΏΠΈΡΡΡΡΡΡΡ ΡΠ΅ΡΠ΅Π· if Ρ throw.
ΠΠΎΠ»ΠΈ ΡΠ°ΠΊΠ° ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠ° Π·Π°ΠΉΠΌΠ°Ρ Π»ΠΈΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΡΠΈΠΉ Π±Π»ΠΎΠΊ, Laravel Π΄ΠΎΠ·Π²ΠΎΠ»ΡΡ Π·ΡΠΎΠ±ΠΈΡΠΈ Π½Π°ΠΌΡΡ ΡΠ΅ ΠΏΠΎΠΌΡΡΠ½ΡΡΠΈΠΌ ΡΠ΅ΡΠ΅Π· throw_if() Π°Π±ΠΎ throw_unless().
ΠΠ°ΠΌΡΡΡΡ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ if + throw
if (! $user->isActive()) { throw new DomainException( 'User must be active.', );}throw_unless( $user->isActive(), DomainException::class, 'User must be active.',);ΠΠ±ΠΈΠ΄Π²Π° Π²Π°ΡΡΠ°Π½ΡΠΈ Π·ΡΠΏΠΈΠ½ΡΡΡΡ Π²ΠΈΠΊΠΎΠ½Π°Π½Π½Ρ, ΡΠΊΡΠΎ ΠΊΠΎΡΠΈΡΡΡΠ²Π°Ρ Π½Π΅Π°ΠΊΡΠΈΠ²Π½ΠΈΠΉ. ΠΠ»Π΅ throw_unless() ΡΠΈΡΠ°ΡΡΡΡΡ ΡΠΊ ΠΊΠΎΡΠΎΡΠΊΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ: ΠΏΡΠΎΠ΄ΠΎΠ²ΠΆΡΠΉ Π»ΠΈΡΠ΅ ΡΠΎΠ΄Ρ, ΠΊΠΎΠ»ΠΈ ΠΊΠΎΡΠΈΡΡΡΠ²Π°Ρ Π°ΠΊΡΠΈΠ²Π½ΠΈΠΉ.
Π¦Π΅ Π½Π°ΠΉΠ±ΡΠ»ΡΡ ΠΊΠΎΡΠΈΡΠ½ΠΎ Π½Π° ΠΏΠΎΡΠ°ΡΠΊΡ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π΄Π΅ ΠΊΡΠ»ΡΠΊΠ° Π·Π°Ρ ΠΈΡΠ½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΎΠΊ Π²ΠΈΠ·Π½Π°ΡΠ°ΡΡΡ, ΡΠΈ ΠΌΠΎΠΆΠ½Π° Π²Π·Π°Π³Π°Π»Ρ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΡΠΈ Π΄ΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡ Π»ΠΎΠ³ΡΠΊΠΈ.
throw_if() Ρ throw_unless() ΠΎΠΏΠΈΡΡΡΡΡ ΡΠΌΠΎΠ²Ρ Π· ΡΡΠ·Π½ΠΈΡ Π±ΠΎΠΊΡΠ²
throw_if( $order->isCancelled(), DomainException::class, 'Cancelled order cannot be processed.',); throw_unless( $user->isActive(), DomainException::class, 'User must be active.',);ΠΠΎΠΆΠ½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΠΊΠ»Π°Ρ Π²ΠΈΠ½ΡΡΠΊΡ ΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ ΠΉΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°
final class InactiveUserException extends DomainException{ public function __construct(int $userId) { parent::__construct( "User {$userId} must be active.", ); }} throw_unless( $user->isActive(), InactiveUserException::class, $user->id,);ΠΡΡΠ³ΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π½Π°Π·Π²ΠΎΡ ΠΊΠ»Π°ΡΡ Π²ΠΈΠ½ΡΡΠΊΡ. Π―ΠΊΡΠΎ ΡΠΌΠΎΠ²Π° Π²ΠΈΠΌΠ°Π³Π°Ρ ΠΊΠΈΠ½ΡΡΠΈ Π²ΠΈΠ½ΡΡΠΎΠΊ, Laravel ΡΡΠ²ΠΎΡΠΈΡΡ ΡΠ΅ΠΉ ΠΊΠ»Π°Ρ Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡ Π½Π°ΡΡΡΠΏΠ½Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈ Π² ΠΉΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ.
Π¦Π΅ Π΄ΠΎΠ±ΡΠ΅ ΠΏΡΠ°ΡΡΡ Π· ΠΏΡΠ΅Π΄ΠΌΠ΅ΡΠ½ΠΈΠΌΠΈ Π²ΠΈΠ½ΡΡΠΊΠ°ΠΌΠΈ, Π΄Π΅ Π½Π°Π·Π²Π° ΠΊΠ»Π°ΡΡ ΠΏΠΎΡΡΠ½ΡΡ ΠΏΡΠΈΡΠΈΠ½Ρ Π·ΡΠΏΠΈΠ½ΠΊΠΈ ΠΊΡΠ°ΡΠ΅ Π·Π° Π·Π°Π³Π°Π»ΡΠ½ΠΈΠΉ RuntimeException.
Helper ΡΠ°ΠΊΠΎΠΆ ΠΏΡΠΈΠΉΠΌΠ°Ρ Π³ΠΎΡΠΎΠ²ΠΈΠΉ Π²ΠΈΠ½ΡΡΠΎΠΊ Π°Π±ΠΎ Π·Π²ΠΈΡΠ°ΠΉΠ½ΠΈΠΉ ΡΠ΅ΠΊΡΡ
throw_if( $order->isLocked(), new LogicException('Order is locked.'),); throw_if( $quantity < 1, 'Quantity must be greater than zero.',);ΠΠΎΠΆΠ½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π²ΠΆΠ΅ ΡΡΠ²ΠΎΡΠ΅Π½ΠΈΠΉ ΠΎΠ±'ΡΠΊΡ Π²ΠΈΠ½ΡΡΠΊΡ. Π―ΠΊΡΠΎ Π΄ΡΡΠ³ΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠΌ Ρ Π·Π²ΠΈΡΠ°ΠΉΠ½ΠΈΠΉ ΡΠ΅ΠΊΡΡ, Laravel ΡΡΠ²ΠΎΡΠΈΡΡ RuntimeException Π· ΡΠΈΠΌ ΠΏΠΎΠ²ΡΠ΄ΠΎΠΌΠ»Π΅Π½Π½ΡΠΌ.
ΠΠ»Ρ Π±ΡΠ·Π½Π΅Ρ-ΠΏΡΠ°Π²ΠΈΠ» ΠΎΠΊΡΠ΅ΠΌΠΈΠΉ ΠΊΠ»Π°Ρ Π²ΠΈΠ½ΡΡΠΊΡ ΡΠ°ΡΡΠΎ Π΄Π°Ρ ΠΊΡΠ°ΡΠΈΠΉ ΠΊΠΎΠ½ΡΡΠ°ΠΊΡ, Π° ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ ΡΠ΅ΠΊΡΡ Π·ΡΡΡΠ½ΠΈΠΉ Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΈΡ ΡΠ΅Ρ Π½ΡΡΠ½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΎΠΊ.
ΠΡΠ»ΡΠΊΠ° Π½Π΅Π·Π°Π»Π΅ΠΆΠ½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ» Π΄ΠΎΠ±ΡΠ΅ ΡΠΈΡΠ°ΡΡΡΡΡ ΡΠΊ ΠΏΠΎΡΠ»ΡΠ΄ΠΎΠ²Π½ΡΡΡΡ Π·Π°Ρ ΠΈΡΠ½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΎΠΊ
throw_unless( $user->isActive(), InactiveUserException::class, $user->id,); throw_if( $order->isCancelled(), OrderCancelledException::class, $order->id,); throw_unless( $order->canBeProcessed(), OrderCannotBeProcessedException::class, $order->id,ΠΡΠ½ΠΎΠ²Π½Π° Π»ΠΎΠ³ΡΠΊΠ° Π·Π°Π»ΠΈΡΠ°ΡΡΡΡΡ Π²Π½ΠΈΠ·Ρ Π±Π΅Π· Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²ΠΈΡ ΡΡΠ²Π½ΡΠ² Π²ΠΊΠ»Π°Π΄Π΅Π½ΠΎΡΡΡ. ΠΠΎΠΆΠ΅Π½ ΡΡΠ΄ΠΎΠΊ ΠΏΠ΅ΡΠ΅Π΄ Π½Π΅Ρ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Π°Ρ Π½Π° ΠΎΠ΄Π½Π΅ ΠΏΠΈΡΠ°Π½Π½Ρ: ΡΠΊΠ° ΡΠΌΠΎΠ²Π° ΠΏΠΎΠ²ΠΈΠ½Π½Π° Π²ΠΈΠΊΠΎΠ½ΡΠ²Π°ΡΠΈΡΡ, ΡΠΎΠ± ΠΌΠ΅ΡΠΎΠ΄ ΠΌΡΠ³ ΠΏΡΠΎΠ΄ΠΎΠ²ΠΆΠΈΡΠΈ ΡΠΎΠ±ΠΎΡΡ.
Π’Π°ΠΊΠΈΠΉ ΡΡΠΈΠ»Ρ ΠΎΡΠΎΠ±Π»ΠΈΠ²ΠΎ Π·ΡΡΡΠ½ΠΈΠΉ, ΠΊΠΎΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠΈ Π½Π΅Π·Π°Π»Π΅ΠΆΠ½Ρ ΠΎΠ΄Π½Π° Π²ΡΠ΄ ΠΎΠ΄Π½ΠΎΡ Ρ ΠΊΠΎΠΆΠ½Π° ΠΌΠ°Ρ Π²Π»Π°ΡΠ½ΠΈΠΉ Π²ΠΈΠ½ΡΡΠΎΠΊ.
Π‘ΠΊΠ»Π°Π΄Π½Ρ ΡΠΌΠΎΠ²Ρ ΠΊΡΠ°ΡΠ΅ ΡΠΏΠΎΡΠ°ΡΠΊΡ Π½Π°Π·Π²Π°ΡΠΈ
throw_unless( $user->isActive() && ! $order->isCancelled() && ( $order->belongsTo($user) || $user->isAdmin() ), DomainException::class, 'Order cannot be processed.',);$canProcessOrder = $user->isActive() && ! $order->isCancelled() && ( $order->belongsTo($user) || $user->isAdmin() ); throw_unless( $canProcessOrder, DomainException::class, 'Order cannot be processed.',);throw_if() Ρ throw_unless() Π½Π΅ ΡΠΎΠ±Π»ΡΡΡ ΡΠΊΠ»Π°Π΄Π½Ρ ΡΠΌΠΎΠ²Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π·ΡΠΎΠ·ΡΠΌΡΠ»ΠΎΡ. Π―ΠΊΡΠΎ Π²ΠΈΡΠ°Π· ΡΠΆΠ΅ Π²Π°ΠΆΠΊΠΎ ΠΏΡΠΎΡΠΈΡΠ°ΡΠΈ, Π΄Π°ΠΉΡΠ΅ ΠΉΠΎΠΌΡ Π½Π°Π·Π²Ρ Π°Π±ΠΎ Π²ΠΈΠ½Π΅ΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π² ΠΎΠΊΡΠ΅ΠΌΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄.
Π’Π°ΠΊΠΎΠΆ ΡΡ helper-ΡΡΠ½ΠΊΡΡΡ Π½Π΅ Ρ Π·Π°ΠΌΡΠ½ΠΎΡ Π΄Π»Ρ Π²ΡΡΡ
ΡΠ½ΡΠΈΡ
ΠΌΠ΅Ρ
Π°Π½ΡΠ·ΠΌΡΠ² Laravel. ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠΈ Π²Ρ
ΡΠ΄Π½ΠΈΡ
Π΄Π°Π½ΠΈΡ
ΠΊΡΠ°ΡΠ΅ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠ²Π°ΡΠΈ validation, Π΄Π»Ρ ΠΏΡΠ°Π²ΠΈΠ» Π΄ΠΎΡΡΡΠΏΡ - policies Π°Π±ΠΎ gates, Π° Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ HTTP status response ΠΌΠΎΠΆΡΡΡ Π±ΡΡΠΈ Π΄ΠΎΡΠ΅ΡΠ½Ρ abort_if() ΡΠ° abort_unless().
Π¦Π΅ ΡΠΊΠΎΡΠΎΡΠ΅Π½Π½Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡ, Π° Π½Π΅ Π½ΠΎΠ²Π° ΠΌΠΎΠ΄Π΅Π»Ρ ΠΎΠ±ΡΠΎΠ±ΠΊΠΈ ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ
ΠΠΎΠ»ΠΈ Π·Π²ΠΈΡΠ°ΠΉΠ½ΠΈΠΉ if + throw ΠΊΡΠ°ΡΠΈΠΉ
- ΠΊΠΎΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΈΠ½ΡΡΠΊΠΎΠΌ ΡΡΠ΅Π±Π° Π²ΠΈΠΊΠΎΠ½Π°ΡΠΈ ΠΊΡΠ»ΡΠΊΠ° Π΄ΡΠΉ;
- ΠΊΠΎΠ»ΠΈ ΡΠΌΠΎΠ²Π° ΠΌΠ°Ρ ΡΠΊΠ»Π°Π΄Π½Π΅ ΠΏΠΎΡΡΠ½Π΅Π½Π½Ρ Ρ ΠΎΠΊΡΠ΅ΠΌΠΈΠΉ Π±Π»ΠΎΠΊ ΡΠΎΠ±ΠΈΡΡ ΠΊΠΎΠ΄ Π·ΡΠΎΠ·ΡΠΌΡΠ»ΡΡΠΈΠΌ;
- ΠΊΠΎΠ»ΠΈ Ρ
elseΠ°Π±ΠΎ ΠΊΡΠ»ΡΠΊΠ° ΡΡΠ·Π½ΠΈΡ Π³ΡΠ»ΠΎΠΊ ΠΏΠΎΠ²Π΅Π΄ΡΠ½ΠΊΠΈ; - ΠΊΠΎΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠ° ΠΌΡΡΡΠΈΡΡ Π²Π°ΠΆΠ»ΠΈΠ²ΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, ΡΠΊΠΈΠΉ Π³ΡΠ±ΠΈΡΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌΡ ΡΡΠ΄ΠΊΡ;
- ΠΊΠΎΠ»ΠΈ Π·Π²ΠΈΡΠ°ΠΉΠ½ΠΈΠΉ
ifΠ΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΡΠΈΡΠ°ΡΡΡΡΡ ΠΏΡΠΈΡΠΎΠ΄Π½ΡΡΠ΅ Π·Π° Π½Π΅Π·Π½Π°ΠΉΠΎΠΌΡ helper-ΡΡΠ½ΠΊΡΡΡ.
Π‘ΠΈΠ»Π° throw_if() Ρ throw_unless() Π½Π΅ Π² ΠΌΡΠ½ΡΠΌΠ°Π»ΡΠ½ΡΠΉ ΠΊΡΠ»ΡΠΊΠΎΡΡΡ ΡΡΠ΄ΠΊΡΠ². ΠΠΎΠ½ΠΈ ΠΊΠΎΡΠΈΡΠ½Ρ ΡΠΎΠ΄Ρ, ΠΊΠΎΠ»ΠΈ ΠΏΡΠΎΡΡΠ° Π·Π°Ρ
ΠΈΡΠ½Π° ΠΏΠ΅ΡΠ΅Π²ΡΡΠΊΠ° ΠΏΠΎΡΠΈΠ½Π°Ρ ΡΠΈΡΠ°ΡΠΈΡΡ ΡΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ: ΡΠΊΡΠΎ ΡΠ΅ΠΉ ΡΡΠ°Π½ Π·Π°Π±ΠΎΡΠΎΠ½Π΅Π½ΠΈΠΉ - Π·ΡΠΏΠΈΠ½ΠΈΡΡ; ΡΠΊΡΠΎ ΡΠ΅ΠΉ ΡΠ½Π²Π°ΡΡΠ°Π½Ρ Π½Π΅ Π²ΠΈΠΊΠΎΠ½ΡΡΡΡΡΡ - Π·ΡΠΏΠΈΠ½ΠΈΡΡ.




