Skip to content

Latest commit

 

History

History
197 lines (147 loc) · 6.41 KB

README-tr.md

File metadata and controls

197 lines (147 loc) · 6.41 KB
Package Image

HTTP Precondition for Laravel

Latest Version on Packagist MIT Licensed Tests Total Downloads

Kurulum

Kurulum icin projenizde asagidaki komutu calistirin:

composer require onursimsek/precondition

Kullanim

Bir istemci sizden bir kaynagi istemis (GET), bir sure sonra kaynakta guncelleme yapip size geri gondermek (PUT) ister. O sirada baska bir istemci de ayni kaynagi almis (GET) ve ilk istemciden once guncellemistir (PUT). Bu durumda ilk istemcinin yapmis oldugu guncelleme yanlis bir kopya uzerinden olacaktir ve ikinci istemcinin yaptigi guncellemeleri gormezden gelecektir. Buna kayip guncelleme problemi denir.

Boyle bir durumda ilk istemciye 428 Precondition Required donusunde bulunarak, kaynagi tekrar cekmesini isteyebilirsiniz.

Bu paket bu islemi kolayca yapmanizi saglar. Tek yapmaniz gereken bir Validator class'i olusturmak ve ilgili controller metoduna attribute olarak eklemek.

use Illuminate\Http\Request;
use OnurSimsek\Precondition\Validators\PreconditionValidator;

class LostUpdateValidator extends PreconditionValidator
{
    public function parameter(Request $request)
    {
        return $request->header('If-Unmodified-Since');
    }

    public function __invoke(Request $request): bool
    {
        return $this->parameter($request) == $request->route('article')->updated_at;
    }
}
use App\Models\Article;
use App\Http\Requests\UpdateArticleRequest;
use OnurSimsek\Precondition\Attributes\Precondition;

class ArticleController
{
    #[Precondition(LostUpdateValidator::class)]
    public function update(Article $article, UpdateArticleRequest $request)
    {
        $article->fill($request->validated())
        $article->save();

        return response()->json();
    }
}

Son olarak kullanmak istediginiz route'a precondition middleware'ini eklemeniz gerekiyor.

Route::put('/articles/{:article}', [ArticleController::class, 'update'])
    ->middleware(['precondition']);

Bunun disinda bir istegin gerceklestirilmesi icin herhangi bir sartiniz varsa yine bu paketi kullanabilirsiniz. Iste bazi ornekler;

Github Ornegi

Bir repo silinmeden once repo adinin tekrar yazilmasi istenir.

use Illuminate\Http\Request;
use OnurSimsek\Precondition\Validators\PreconditionValidator;

class DeleteRepositoryValidator extends PreconditionValidator
{
    public function parameter(Request $request)
    {
        return $request->input('repository_name');
    }

    public function __invoke(Request $request): bool
    {
        return $this->parameter($request) == $request->route('repository')->name;
    }
}

Not: Repo adi dogru degilse, cevap 412 Precondition Failed durum kodu ile doner.

SMS ile Dogrulama

Odeme islemi yapilmadan once sms dogrulamasi yapilmak istenir.

use Illuminate\Http\Request;
use OnurSimsek\Precondition\Validators\PreconditionValidator;

class SmsValidator extends PreconditionValidator
{
    public function preProcess(): void
    {
        cache()->set('sms', '123456');
    }

    public function parameter(Request $request)
    {
        return $request->input('sms_code');
    }

    public function __invoke(Request $request): bool
    {
        return $this->parameter($request) == cache()->get('sms');
    }
}

Opsiyonel Dogrulama

Dogrulamayi duruma gore yapmak istiyorsaniz asagidaki gibi when method'unu kullanabilirsiniz.

use Illuminate\Http\Request;
use OnurSimsek\Precondition\Validators\PreconditionValidator;

class PrivateArticleValidator extends PreconditionValidator
{
    public function when(Request $request) 
    {
        return $request->route('article')->is_private;
    }

    public function parameter(Request $request)
    {
        return $request->header('X-Article-Secret-Code');
    }

    public function __invoke(Request $request): bool
    {
        return $this->parameter($request) == $request->route('article')->secret_code;
    }
}

Hata mesajlarini ozellestirmek icin validator class'inda messages() metodunu kullanabilirsiniz.

public function messages(): array
{
    return [
        'required' => 'Telefonunuza gelen sms kodunu giriniz.',
        'failed' => 'Sms kodunu dogru girmediniz!',
    ];
}

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.