PHPPamokos.lt


10. Vartotojai, registracija ir sesijos

Turbūt dažniausiai internete naudojamos formos yra skirtos vartotojų registracijai ir autorizacijai. Laravel ir šioje vietoje turi pagalbininkų - apie juos ir kalbėsime šiame skyrelyje.

Ar pastebėjote, kad po Laravel diegimo kai kurie failai jau buvo jums pateikti kaip pavyzdys? Vienas iš tokių yra app/User.php - jis atsako už viską, kas susiję su vartotojais. Taip sakant, imkit ir naudokit. Būtent taip ir padarysime.

Taip pat su Laravel ateina ir du migrations failai - juose yra sukuriamos dvi duomenų bazės lentelės, atsakančios už vartotojus - viena skirta patiems vartotojams, o kita slaptažodžių priminimams: database/migrations/2014_10_12_000000_create_users_table.php
class CreateUsersTable extends Migration
{
  public function up()
  {
    Schema::create('users', function (Blueprint $table) {
      $table->increments('id');
      $table->string('name');
      $table->string('email')->unique();
      $table->string('password', 60);
      $table->rememberToken();
      $table->timestamps();
    });
  }
database/migrations/2014_10_12_100000_create_password_resets_table.php
class CreatePasswordResetsTable extends Migration
{
  public function up()
  {
    Schema::create('password_resets', function (Blueprint $table) {
      $table->string('email')->index();
      $table->string('token')->index();
      $table->timestamp('created_at');
    });
  }
Praleidžiame komanda php artisan migrate, ir tos dvi lentelės susikuria mūsų duomenų bazėje.

Ir tada pereikime prie viso autorizacijos mechanizmo.

1. Auth Controller'iai ir Routes

Dar vienas katalogas, pateikiamas mums nuo pat pradžių su Laravel yra app/Http/Controllers/Auth - ten yra tokie failai kaip LoginController.php ir RegisterController.php - jie, iš esmės, vykdo visas autorizacijos operacijas. Mums reikia tiesiog į savo failą routes/web.php įdėti reikalingus URL adresus. Oficialioje Laravel dokumentacijoje siūloma taip:

// Authentication routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
Štai tiek darbo iš Routes pusės. Kita gera žinia yra ta, kad mums nereikia nieko keisti Controlleryje, reikia tik sukurti Views failus kataloge resources/views/auth. Tai pereikime prie to.

2. Registracijos forma

Jei kalbėti apie formą iš Blade ir View pusės, tai čia viskas bus gana paprasta. Sukurkime resources/views/auth/register.blade.php:
<h2>Registracija</h2>

@if ($errors->any())
  <ul>
    @foreach($errors->all() as $error)
      <li>{{ $error }}</li>
    @endforeach
  </ul>
@endif

{!! Form::open(['url' => 'register']) !!}
Vardas
<br />
{!! Form::text('name', old('name')) !!}
<br /><br />
El.pašto adresas
<br />
{!! Form::email('email', old('email')) !!}
<br /><br />
Slaptažodis
<br />
{!! Form::password('password') !!}
<br /><br />
Pakartokite slaptažodį
<br />
{!! Form::password('password_confirmation') !!}
<br /><br />
<button type="submit">Registruotis</button>
{!! Form::close() !!}
Kaip matome, iš anksto pasirūpiname $errors konstrukcija, per kurią gali ateiti klaidos iš Validatoriaus. O daugiau viskas turėtų būti kaip ir aišku.
 

3. Registracijos apdorojimas

Kaip sakiau, Controlleriuose mums daryti nieko nereikia - visą "magiją" atliks RegisterController.php. Bet tai ne visai tiesa. Jei užpildysite mūsų formą viršuje, vartotojas susikurs, bet Laravel automatiškai perkels po rezultatų į URL adresą /home. Be abejo, mes tokio neturime, tai išmes klaidą. Dėl to reikia pakeisti nustatymus, į kokį puslapį permetamas vartotojas po registracijos. Tam RegisterController.php prirašome tokią eilutę:
protected $redirectPath = '/';

4. Prisijungimo forma

Čia viskas panašiai kaip ir registracijoje. Pirmiausia - sukurkime resources/views/auth/login.blade.php:
{!! Form::open(['url' => 'login']) !!}
El.pašto adresas
<br />
{!! Form::email('email', old('email')) !!}
<br /><br />
Slaptažodis
<br />
{!! Form::password('password') !!}
<br /><br />
<button type="submit">Prisijungti</button>
{!! Form::close() !!}

 

5. Prisijungimo apdorojimas

Kaip ir su registracija, visus reikalingus patikrinimus atlieka atitinkamai LoginController, tai jei vartotojas įvedė neteisingus duomenis - jis bus grąžintas atgal į prisijungimo formą su klaida. O jei sėkmingai prisijungė - bus perkeltas į mūsų pagrindinį puslapį.
 

Prisijungimo patikrinimas visos sesijos metu

Kaip mes įprastai patikriname vartotojų prisijungimą nuo puslapio iki puslapio? Darome session_start() ir tikriname $_SESSION reikšmes. Laravel gi atveju viskuo pasirūpina klasė Auth, gan stipriai palengvindama mums gyvenimą.

Kad patikrintumėte, ar vartotojas prisijungęs, užtenka tiesiog:
if (Auth::check())
{
  // vartotojas prisijungęs
}
Arba atvirkščiai - jei norite, kad vartotojas neprisijungęs, yra kitokia funkcija:
if (Auth::guest())
{
  // vartotojas neprisijungęs
}
Viskas - jokių sesijų startų, ilgų patikrinimų ir pan. O kai lankytojas nori atsijungti nuo savo paskyros, Controlleryje iškviečiate šią paprastą funkciją:
Auth::logout();
Vėliau naršant svetainėje, vartotojo duomenys galės bus paimti štai taip. Sakykime, reikia el.pašto adreso:
$email = Auth::user()->email;
O jeigu reikia tiesiog vartotojo ID iš DB lauko users.id, tai štai taip:
$id = Auth::id();
Bet ir tai dar ne viskas. Prisiminkime Middleware - viena iš Laravel jau siūlomų klasių ir yra auth, kurią mes tiesiog galime naudoti savo routes/web.php faile. Jei norime apsaugoti konkretų URL su prisijungimo mechanizmu, tai labai paprasta:
Route::group(['middleware' => 'auth'], function() {
  Route::resource('admin/aiksteles', 'AdminCourtsController');
  Route::resource('admin/miestai', 'AdminCitiesController');
  Route::resource('admin/aiksteliu_tipai', 'AdminTypesController');
});
 

SESSION: Darbas su didesniais sesijų duomenimis

Jeigu jau prakalbome apie sesijas, reikia ta tema išsiplėsti. Jeigu reikia saugoti daugiau duomenų, nei vien tik autentifikavimo faktą su Auth, kaip saugomi tie sesijų duomenys - ar Laravel siūlo ką nors patogesnio už mums įprastą $_SESSION masyvą? Taip, tam skirta funkcija pavadinimu session(), kurią jau ką tik trumpai panaudojome prisijungimo formoje, o dabar apie ją sužinosite daugiau.

Tiesiog palyginkime įprastas PHP funkcijas su Laravel siūloma Session klase.

PHP variantas:
session_start();

// reikšmės priskyrimas
$_SESSION['key'] = 'value';

// reikšmės paėmimas
$var = $_SESSION['key'];

// reikšmės paėmimas ir priskyrimas default reikšmės
$var = ($_SESSION['key']) ? $_SESSION['key'] : 'Default';

// kintamojo ištrynimas iš sesijos
unset($_SESSION['key']);

// reikšmės paėmimas ir kintamojo ištrynimas iš sesijos
$var = $_SESSION['key'];
unset($_SESSION['key']);

// visos sesijos paėmimas
$session = $_SESSION;

// patikrinimas, ar sesijos kintamasis egzistuoja
if (isset($_SESSION['user'])) { ... }

// sesijos užbaigimas
session_destroy();
Laravel variantas - session_start() iš viso kviesti nereikia:
// reikšmės priskyrimas
session(['key' => 'value']);

// reikšmės paėmimas
$var = session('key');

// reikšmės paėmimas ir priskyrimas default reikšmės
$var = session('key', 'Default');

// kintamojo ištrynimas iš sesijos
session()->forget('key');

// reikšmės paėmimas ir kintamojo ištrynimas iš sesijos
$var = session()->pull('key');

// visos sesijos paėmimas
$session = session()->all();

// patikrinimas, ar sesijos kintamasis egzistuoja
if (session()->has('user')) { ... }

// sesijos užbaigimas
session()->flush();

// papildomas dalykas, kurio PHP neturi:
// kintamojo saugojimas tik trumpam, vienam sekančiam puslapiui
session()->flash('key', 'value');
Kaip matote, sintaksės ir rašymo prasme didelių laimėjimų nelabai yra, tad jūsų pasirinkimas, ar naudoti $_SESSION, ar Laravel metodą session().

Reikia pridurti, kad per Laravel galima nesunkiai nustatyti, kur ir kaip būtent saugomi Session klasės duomenys. Faile config/session.php yra tokia eilutė:
'driver' => 'file',
Ji reiškia, kad sesijos bus saugomos jūsų serveryje, kataloge storage/sessions. Jei norite saugoti kitur - vietoje 'file' yra tokie variantai:
  • cookie - užkoduojamos COOKIES reikšmės
  • database - jūsų duomenų bazėje
  • memcached arba redis - atskiri sprendimai kešavimui
 

Praktika: administratoriaus prisijungimas

Iš principo, šios pamokos metu jau pademonstravau prisijungimo ir registracijos formas, tai į mūsų projektą galėsite jas įkelti be didelio vargo. Tik dar reikia pavaizduoti administratoriaus meniu.

Dėl meniu - viskas paprasta: šablone resources/views/base.blade.php įrašome štai ką:

@if (Auth::check())
  <li><a href="{{ url('admin/aiksteles') }}">Aikštelės</a></li>
  <li><a href="{{ url('admin/aiksteliu_tipai') }}">Aikštelių tipai</a></li>
  <li><a href="{{ url('admin/miestai') }}">Miestai</a></li>
  <li><a href="{{ url('logout') }}">Atsijungti</a></li>
@else
  <li><a href="{{ url('login') }}">Prisijungti</a></li>
@endif

Su meniu atvaizdavimu, pozicijomis ir CSS galite pažaisti patys, čia nėra esminis dalykas šiame kurse.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com