Реализация пользовательского соглашения на сайте
Пользовательское соглашение (Terms of Service / Оферта) — публичный договор между сервисом и пользователем, определяющий правила использования сайта, права и обязанности сторон.
Юридический статус
В РФ пользовательское соглашение чаще всего оформляется как публичная оферта по ст. 435-437 ГК РФ. Акцепт (принятие) — регистрация, оформление заказа или явный чекбокс. Важно: «нажимая кнопку, вы соглашаетесь» юридически слабее, чем явный чекбокс.
Техническая реализация
Отдельная страница с постоянным URL:
Route::get('/terms', fn() => view('legal.terms'))->name('terms');
Route::get('/terms/{version}', [LegalController::class, 'termsVersion'])->name('terms.version');
Версионирование:
class LegalDocument extends Model
{
protected $fillable = ['type', 'version', 'content', 'is_current', 'effective_from'];
public static function currentTerms(): self
{
return static::where('type', 'terms')
->where('is_current', true)
->firstOrFail();
}
}
Фиксация принятия версии:
// При регистрации записываем версию принятого соглашения
$user->update([
'terms_version_accepted' => LegalDocument::currentTerms()->version,
'terms_accepted_at' => now(),
'terms_accepted_ip' => $request->ip(),
]);
Принудительное переподтверждение при обновлении:
// Middleware
class RequireCurrentTerms
{
public function handle(Request $request, Closure $next)
{
$currentVersion = LegalDocument::currentTerms()->version;
if (auth()->check()
&& auth()->user()->terms_version_accepted !== $currentVersion
&& !$request->is('terms*', 'logout*', 'accept-terms')) {
return redirect()->route('terms.accept');
}
return $next($request);
}
}
Ссылки:
{{-- В футере --}}
<a href="{{ route('terms') }}">Пользовательское соглашение</a>
{{-- При регистрации --}}
<label>
<input type="checkbox" name="terms_accepted" required>
Я принимаю <a href="{{ route('terms') }}" target="_blank">пользовательское соглашение</a>
</label>
Срок реализации
Техническая часть с версионированием и фиксацией принятия — 6–10 часов.







