Payment#1
Conversation
modified: public/js/app.js
modified: composer.json
modified: app/Actions/Pay.php modified: app/Actions/Status.php new file: app/Http/Livewire/CardForm.php modified: app/Http/Livewire/PaymentForm.php new file: app/Http/Livewire/QiwiForm.php new file: app/Http/Livewire/YoomoneyForm.php new file: app/Rules/YooNumber.php new file: config/livewire.php modified: public/js/app.js new file: public/vendor/livewire/livewire.js new file: public/vendor/livewire/livewire.js.map new file: public/vendor/livewire/manifest.json modified: resources/js/components/payment-form-mask.js modified: resources/lang/en/validation.php modified: resources/views/components/form/button.blade.php modified: resources/views/components/form/input.blade.php new file: resources/views/components/payment/method-wrap.blade.php new file: resources/views/components/payment/methods.blade.php new file: resources/views/components/payment/wrap.blade.php new file: resources/views/livewire/card-form.blade.php deleted: resources/views/livewire/payment-form.blade.php new file: resources/views/livewire/qiwi-form.blade.php new file: resources/views/livewire/yoomoney-form.blade.php modified: resources/views/pages/pay.blade.php
mulenokd
left a comment
There was a problem hiding this comment.
В целом хотелось бы видеть более динамичный и расширяемый подход. В идеале - чтобы при введении нового способа оплаты мы могли добавить только компонент формы по типу YoomoneyForm, который отвечал бы за конкретные данные и их валидацию. Но в текущем подходе нам нужно будет добавить его в список табов, в список форм, а так же прописать ему какую-то дополнительную логику для дозапроса данных.
| public string $phoneReq = ''; | ||
| public bool $needPhone = false; | ||
|
|
||
| public function submit() |
There was a problem hiding this comment.
Метод submit() дублируется практически во всех формах. Решение - добавить некий метод needToRequestExtraData() в базовый класс, который отвечает за дозапрос данных.
| { | ||
| $this->validate(); | ||
|
|
||
| if ($this->hasPhoneService()) { |
There was a problem hiding this comment.
Представим ситуацию, что теперь бизнес хочет запрашивать e-mail для отправки чека об оплате, причем только для плательщиков из РФ. В этом случае нам придется вводить ещё одну проверку внутри карточной формы, что не есть хорошо. Было бы здорово, если бы за это отвечал отдельный сервис, который понимал, какие данные и когда нам нужно запросить.
| 'cvc' => ['required', 'size:3', new CardCvc($this->card)], | ||
| 'phoneReq' => [ | ||
| 'sometimes', | ||
| 'regex:/^\+\d{1,2}\(\d{3}\)\d{3}-\d{2}-\d{2}$/', |
There was a problem hiding this comment.
Валидация номера телефона уже есть в QiwiForm - поэтому для избежания дублирования это правило можно было вынести в Rule по типу App\Rules\YooNumber.php
| { | ||
| return [ | ||
| 'card' => ['required', new CardNumber], | ||
| 'exp' => ['required', new CardExpirationDate('m/y')], |
There was a problem hiding this comment.
Я намеренно не использовал это правило, потому что есть банковские карты РФ с истекшим сроком действия, но которые до сих пор работают. Не считаю за ошибку, т.к. это особенности внутренней кухни.
| Payment methods | ||
| </div> | ||
|
|
||
| <x-payment.method-wrap :type="'BANK_CARD'" :typeName="'Bank card'"/> |
There was a problem hiding this comment.
Если добавятся другие способы оплаты - придется идти в код и добавлять их. Было бы лучше, если бы компонент payment.methods принимал на вход доступные способы оплаты и отображал их через простой foreach
|
|
||
| <x-payment.methods/> | ||
|
|
||
| <x-payment.wrap :type="'BANK_CARD'"> |
There was a problem hiding this comment.
Та же история с динамическим рендером компонентов. При внесении ещё одного - нужно добавлять его и тут.
| @@ -0,0 +1,59 @@ | |||
| <div wire:init="componentInit" class="w-full" | |||
| x-data="{ needPhone: @entangle('needPhone') }"> | |||
| <div class="max-w-sm w-full mx-auto rounded-lg bg-white px-4 pt-4 pb-6 shadow-md"> | |||
There was a problem hiding this comment.
Выглядит так, что можно ещё много кода вынести в payment.wrap. Рамка, логотип, кнопка - всё дублируется в каждой форме. Было бы лучше, если бы каждый компонент формы отвечал только за ввод и валидацию данных, но не за отображение рамок и логотипов.
Привет)
Выполнил тестовое задание. По нему стоит отметить следующее:
Тесты пока не накидывал, логотипы систем оплаты не ставил.