1. Go to this page and download the library: Download laragear/turnstile library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
laragear / turnstile example snippets
use Illuminate\Support\Facades\Route;
Route::post('login', function () {
// ...
})->middleware('turnstile');
use App\Models\Comment;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Requests\TurnstileRequest;
Route::post('comment', function (TurnstileRequest $request) {
$request->validate([
'body' => '
use App\Models\Comment;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Requests\TurnstileRequest;
Route::post('comment', function (TurnstileRequest $request) {
$request->validate([
'body' => '
namespace App\Http\Requests;
use Laragear\Turnstile\Http\Requests\TurnstileRequest;
class CommentStoreRequest extends TurnstileRequest
{
public function rules(): array
{
return [
'body' => '
use App\Models\Comment;
use Illuminate\Support\Facades\Route;
use App\Http\Requests\CommentStoreRequest;
Route::post('comment', function (CommentStoreRequest $request) {
return Comment::create($request->validated());
})
namespace App\Http\Requests;
use Laragear\Turnstile\Http\Requests\TurnstileRequest;
class CommentStoreRequest extends TurnstileRequest
{
public function getTurnstileKey()
{
return '_cf-custom-key';
}
protected function getTurnstileRules()
{
// Skip if the user is authenticated.
return 'turnstile:auth'
}
// ...
}
namespace App\Http\Requests;
use Laragear\Turnstile\Http\Requests\TurnstileRequest;
class CommentStoreRequest extends TurnstileRequest
{
protected function skipChallengeWhenPrecognitive(): bool
{
return $this->hasHeader('Requires-CF-Turnstile-Challenge');
}
// ...
}
namespace App\Http\Requests;
use Laragear\Turnstile\Http\Requests\TurnstileRequest;
class CommentStoreRequest extends TurnstileRequest
{
public function rules(): array
{
return [
'body' => '
use App\Models\Comment;
use Illuminate\Support\Facades\Route;
use App\Http\Requests\CommentStoreRequest;
Route::post('comment', function (CommentStoreRequest $request) {
return Comment::create($request->validated());
})
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::post('comment', function (Request $request) {
// ...
})->middleware('turnstile');
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\TurnstileMiddleware;
Route::post('comment', function (Request $request) {
// ...
})->middleware(TurnstileMiddleware::acceptFailed())
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\TurnstileMiddleware;
Route::post('comment', function (Request $request) {
// ...
})->middleware(TurnstileMiddleware::input('my-response-token-key'))
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\TurnstileMiddleware;
Route::post('comment', function (Request $request) {
// ...
})->middleware(TurnstileMiddleware::auth());
use Laragear\Turnstile\Http\Middleware\TurnstileMiddleware;
TurnstileMiddleware::auth('admin');
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\TurnstileMiddleware;
Route::post('comment', function (Request $request) {
// ...
})->middleware(TurnstileMiddleware::acceptFailed());
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\TurnstileMiddleware;
Route::post('comment', function (Request $request) {
// ...
})->middleware(TurnstileMiddleware::action('comment:store'));
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\TurnstileMiddleware;
Route::post('comment', function (Request $request) {
// ...
})->middleware(TurnstileMiddleware::onPrecognitive());
use Illuminate\Http\Request;
use Laragear\Turnstile\Facades\Turnstile;
public function create(Request $request)
{
$request->validate([
'comment' => '
use App\Rules\MyCustomRule;
use Illuminate\Http\Request;
use Laragear\Turnstile\Facades\Turnstile;
public function create(Request $request)
{
$request->validate([
// ...
Turnstile::key() => ['turnstile', new MyCustomRule],
]);
// ...
}
use Illuminate\Http\Request;
use Laragear\Turnstile\Facades\Turnstile;
public function create(Request $request)
{
$request->validate([
Turnstile::key() => 'turnstile:auth',
]);
// ...
}
use Illuminate\Http\Request;
use Laragear\Turnstile\Facades\Turnstile;
public function create(Request $request)
{
$request->validate([
Turnstile::key() => '
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Facades\Turnstile;
Route::post('comment', function (Request $request) {
$challenge = Turnstile::getChallenge(
$request->input('cf-turnstile-response'), $request->ip()
);
if ($challenge->failed || $challenge->isNotAction('comment:store')) {
// ... throw an exception.
}
// ... save the comment.
})
use Laragear\Turnstile\Facades\Turnstile;
$challenge = Turnstile::getChallengeFromRequest();
use Laragear\Turnstile\Facades\Turnstile;
$challenge = Turnstile::getChallenge('token', save: false);
use App\Uuid;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Challenge;
use Laragear\Turnstile\Facades\Turnstile;
Route::post('comment', function (Request $request) {
// Generate a UUID using the hash of the input as the seed.
$uuid = Uuid::generateWithSeed(md5(json_encode($request->input('body')));
Turnstile::getChallengeFromRequest(idempotencyKey: $uuid);
// ...
});
use App\Uuid;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Challenge;use Laragear\Turnstile\Turnstile;
Route::post('comment', function (Request $request, Turnstile $turnstile) {
$challenge = $turnstile->getChallenge(
$request->input($turnstile->key()),
$request->header(Turnstile::HEADER)
);
// ...
});
use Laragear\Turnstile\Facades\Turnstile;
$challenge = Turnstile::challenge();
use Laragear\Turnstile\Facades\Turnstile;
if (Turnstile::missingChallenge()) {
return Turnstile::getChallengeFromRequest();
}
return Turnstile::challenge();
use App\Models\Comment;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Facades\Turnstile;
Route::middleware('turnstile:accept-failed')
->post('comment', function (Request $request) {
$request->validate([
'body' => ' return back();
});
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Challenge;
Route::middleware('turnstile')
->post('comment', function (Request $request, Challenge $challenge) {
if ($challenge->isAction('comment:store')) {
// ....
}
// ...
});
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Controllers\InterstitialController;
Route::group(function () {
// ...
})->middleware('turnstile.interstitial');
InterstitialController::register();
use Laragear\Turnstile\Http\Controllers\InterstitialController;
InterstitialController::register('/challenge', 'guest');
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\InterstitialMiddleware;
Route::get('photos', function () {
// ..
})->middleware('turnstile.interstitial:auth');
use Illuminate\Support\Facades\Route;
use Laragear\Turnstile\Http\Middleware\InterstitialMiddleware;
Route::get('photos', function () {
// ..
})->middleware('turnstile.interstitial:auth=web&admins');
> use Laragear\Turnstile\Http\Controllers\InterstitialController;
>
> InterstitialController::register(middleware: 'guest');
>
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withMiddleware(function (Middleware $middleware) {
$middleware->appendToGroup('web', 'turnstile.interstitial');
})
->create();
use App\Models\Ball;
use Laragear\Turnstile\Livewire\InteractsWithTurnstile;
use Livewire\Attributes\Rule;
use Livewire\Component;
class MyCustomPage extends Component
{
use InteractsWithTurnstile;
#[Rule('
public array $data = [];
/**
* Return token for the Turnstile Challenge present in the form.
*/
protected function turnstileToken(): ?string
{
return $this->data['cloudflare-turnstile-token'];
}
/**
* If the validation should be run automatically after validation.
*/
protected function validatesTurnstileAutomatically(): bool
{
return false;
}
public function create()
{
$validated = $this->validate();
// ...
$this->validateTurnstile();
Ball::create($validated);
}
use Illuminate\Support\Str;
use Laragear\Turnstile\Challenge;
/**
* Check if the Turnstile challenge validation should be skipped if authenticated.
*/
protected function skipTurnstileValidation(): bool
{
// Do not run if the user is an admin.
return auth('admins')->check();
}
/**
* Handles the Turnstile challenge and returns true or false if it has succeeded or failed.
*/
protected function handleTurnstileChallengeStatus(Challenge $challenge): bool
{
return $challenge->successful && $challenge->isAction(Str::snake(static::class));
}
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Concerns\InteractsWithForms;
use Filament\Forms\Contracts\HasForms;
use Filament\Pages\Page;
use Filament\Schemas\Schema;
use Laragear\Turnstile\Filament\Forms\TurnstileWidget;
class ContactPage extends Page implements HasForms
{
use InteractsWithForms;
public function form(Schema $schema) : Schema
{
return $schema->components([
TextInput::make('subject')->
use Laragear\Turnstile\Filament\Forms\TurnstileWidget;
TurnstileWidget::make()->withoutScript();
use Laragear\Turnstile\Filament\Forms\TurnstileWidget;
TurnstileWidget::make()->withScript(
stack: 'head-scripts',
attributes: ['meta' => true]
);
return [
'client' => array_merge_recursive([
\GuzzleHttp\RequestOptions::VERSION => 2.0,
// ...Add your config here.
],
// This will detect if your cURL version has HTTP/3 support and prioritize it.
defined('CURL_VERSION_HTTP3') && curl_version()['features'] & CURL_VERSION_HTTP3
? ['curl' => [CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_3]]
: [],
),
];
use Laragear\Turnstile\Facades\Turnstile;
public function test_comment_is_moderated_when_bot_detected()
{
Turnstile::fake([
'success' => false
]);
$this->post(['comment' => 'test_comment']);
$this->assertDatabaseHas('comments', [
'body' => 'test_comment',
'is_moderated' => true
])
}
use Laragear\Turnstile\Enums\SiteKey;
use Laragear\Turnstile\Enums\SecretKey;
use Laragear\Turnstile\Facades\Turnstile;
Turnstile::useTestingSiteKey(SiteKey::ForceInteraction);
Turnstile::useTestingSecretKey(SecretKey::Fails);