Реалізація пользувацького соглашения на сайті
Пользувацька угода (Terms of Service / Оферта) — публічний договір між сервісом та користувачем, що визначає правила використання сайту, права та обов'язки сторін.
Юридичний статус
В Україні пользувацька угода часто оформлюється як публічна оферта за положеннями Цивільного кодексу. Акцепт (прийняття) — реєстрація, оформлення замовлення або явний чекбокс. Важливо: «натискаючи кнопку, ви погоджуєтесь» юридично слабше, ніж явний чекбокс.
Технічна реалізація
Окрема сторінка з постійним 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 годин.







