DEV Community

Juraj Chovan
Juraj Chovan

Posted on

Laravel: Prístup viacerých aplikácii na rovnakú databázu

V prípade, že potrebujem na rovnakú databázu (v príklade nižšie používaná - MySQL) pristupovať z viacerých Laravel aplikácii, a to tak, aby každá z nich mala vlastnú db-tabuľku používateľov a vlastný autentifikačný mechanizmus (nezávislý od druhej aplikácie) tu je návod ako to urobiť.

A.) Prvá aplikácia "LaravelApp01" využivajúca JetStream autentifikáciu a manažovanie používateľa:

1.) Najprv si vytvorím prvú Laravel aplikáciu, spustením príkazu

composer create-project laravel/laravel LaravelApp01
Enter fullscreen mode Exit fullscreen mode

a v podadresári "LaravelApp01" je vytvorená základná štruktúra Laravel aplikácie.

2.) predpokladajme, že potrebnú MySQL databázu už mám vytvorenú (a volá sa "db01".

3.) túto databázu si nastavím/pripojím na ňu aplikáciu "LaravelApp01", a to skonfigurovaním aplikačného/konfiguračného súboru ".env", kde si nastavím:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db01
DB_USERNAME=root
DB_PASSWORD=****
Enter fullscreen mode Exit fullscreen mode

4.) táto prvá Laravel aplikácia bude používať autentifikáciu, registráciu a prihlasovanie cez package "JetStream", takže je potrebné si zinštalovať tento package do aplikácie "LaravelApp01" - v aplikačnom/projektovom adresári spustiť príkaz:

composer require laravel/jetstream
Enter fullscreen mode Exit fullscreen mode

čím sa tento package zinštaluje

5.) ak si teraz spustím developovací server príkazom:

php artisan serve
Enter fullscreen mode Exit fullscreen mode

a v prehliadači si zobrazím URL:

http://localhost:8000/
Enter fullscreen mode Exit fullscreen mode

tj.úvodnú stránku aplikácie "LaravelApp01", vidím tam už aj "Log in" a "Register" odkaz, ale tieto ešte nefungujú. Aplikácia nevie nájsť "auth.login", resp."auth.register"

6.) je potrebné ešte spustiť príkaz:

php artisan jetstream:install livewire
Enter fullscreen mode Exit fullscreen mode

čo vytvorí potrebné migračné skripty, zinštaluje sa package "livewire/livewire" a aktualizujú sa niektoré ďalšie package, a vypublikujú sa potrebné asset-y a vybuild-uje sa aplikácia

7.) je potrebné spustiť migráciu, tj.vytvorenie potrebných db-tabuliek a modelov, príkazom:

php artisan migrate
Enter fullscreen mode Exit fullscreen mode

a v databáze "db01" sú vytvorené db-tabuľky (6ks):

  • failed_jobs
  • migrations
  • password_reset_tokens
  • personal_access_tokens
  • sessions
  • users

8.) ak teraz znovu spustím developovací server a URL aplikácie, už budú fungovať aj odkazy "Login" a "Register" a aj funkcionalita skrývajúca sa za nimi, tj.viem sa zaregistrovať a následne prihlásiť (a potom aj odhlásiť z aplikácie).

B.) Druhá aplikácia "LaravelApp02" využivajúca Bootstrap/UI autentifikáciu a manažovanie používateľa:

1.) opäť podobným spôsobom vytvorím aj druhú Laravel aplikáciu:

composer create-project laravel/laravel LaravelApp02
Enter fullscreen mode Exit fullscreen mode

a v podadresári "LaravelApp02" je vytvorená základná štruktúra Laravel aplikácie.

2.) aplikácia "LaravelApp02" bude tiež napojená na rovnakú databázu, takže nastavenie v súbore ".env" bude tiež:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db01
DB_USERNAME=root
DB_PASSWORD=***
Enter fullscreen mode Exit fullscreen mode

3.) táto druhá Laravel aplikácia "LaravelApp02" bude na autentifikáciu a manažovanie používateľov používať package "bootstrap/ui"

4.) ale ešte pred tým, je potrebné si premenovať názov db-tabuľky, do ktorej si bude táto druhá aplikácia ukladať svojích používateľov (prvá aplikácia "LaravelApp01" má pre tento účel zriadenú default-nú db-tabuľku "users").
Pre druhú aplikáciu si zvolíme napr.názov "admins".

5.) nájsť si súbor migrácie pre "users":

\database\migrations\2014_10_12_000000_create_users_table.php
Enter fullscreen mode Exit fullscreen mode

a tu zeditovať kód takto:

...
return new class extends Migration  {
    public function up(): void    {
        Schema::create('admins', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
    public function down(): void    {
        Schema::dropIfExists('admins');
    }
};
Enter fullscreen mode Exit fullscreen mode

6.) prípadne - ak potrebujem, môžem doplniť nejaké ďalšie atribúty/stlpce, napr.:

...
    $table->string('BusinessName');
    ...
Enter fullscreen mode Exit fullscreen mode

7.) a ešte, kvôli konzistencii je potrebné vhodne premenovať aj tento súbor, tj.pôvodný názov:

\database\migrations\2014_10_12_000000_create_users_table.php
Enter fullscreen mode Exit fullscreen mode

zmeniť na:

\database\migrations\2014_10_12_000000_create_admins_table.php
Enter fullscreen mode Exit fullscreen mode

8.) teraz je čas zinštalovať package "bootstrap/ui" do aplikácie "LaravelApp02" - v aplikačnom/projektovom adresári spustiť príkaz:

composer require laravel/ui
Enter fullscreen mode Exit fullscreen mode

a následne spustiť príkaz:

php artisan ui bootstrap --auth
Enter fullscreen mode Exit fullscreen mode

a na koniec ešte odporúčajú spustiť:

npm install && npm run dev
Enter fullscreen mode Exit fullscreen mode

9.) a teraz spustiť migračné súbory príkazom:
php artisan migrate
a v databáze "db01" sú vytvorené iba dve nové db-tabuľky:

  • admins
  • password_resets

db-tabuľka "admins" bude slúžiť na správu používateľov Laravel aplikácie "LaravelApp02"

10.) ešte je potrebné zmeniť/doplniť v modeli "User":

\app\Models\User.php
Enter fullscreen mode Exit fullscreen mode

kód takto:

...
class User extends Authenticatable  {
    use HasApiTokens, HasFactory, Notifiable;
    protected $table = 'admins';
    ...
Enter fullscreen mode Exit fullscreen mode

11.) a ak som v migrácii (viď krok 6.) doplňal nejaký nový atribút, je potrebné ho doplniť aj tu v modeli:

...
    protected $fillable = [
        'name',
        'email',
        'password',
        'BusinessName',
    ];
Enter fullscreen mode Exit fullscreen mode

12.) doplniť ešte do súboru:

\config\auth.php
Enter fullscreen mode Exit fullscreen mode

takýto kód:

<?php
return [
    'table' => 'admins',
    ...
Enter fullscreen mode Exit fullscreen mode

13.) a aby fungovali zápisy vkladaných hodnôt pri registrácii, je potrebné ešte zeditovať v súbore:

\app\Http\Controllers\Auth\RegisterController.php
Enter fullscreen mode Exit fullscreen mode

kód takto:

...
    protected function validator(array $data)    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:admins'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
        ]);
    }
Enter fullscreen mode Exit fullscreen mode

14.) ak teraz v tejto druhej Laravel aplikácii "LaravelApp02" spustím developovací server a dám si zobraziť úvodnú stránku aplikácie, tj.:

http://localhost:8000/
Enter fullscreen mode Exit fullscreen mode

mám na stránke odkazy "Login" a "Register" a funkcionalita pod nimi funguje, viem sa zaregistrovať a prihlásiť (a aj odhlásiť) a údaje o registrovanom používateľovi sa zapisujú do db-tabuľky "admins"

C.) Tretia aplikácia "LaravelApp03" využivajúca JetStream package na autentifikáciu a manažovanie používateľa:

A vytvorím si ešte aj tretiu Laravel aplikáciu "LaravelApp03", ktorá bude používať (rovnako ako package "LaravelApp01") "JetStream" package na autentifikáciu používateľa.

1.) vytvorím si tretiu aplikáciu príkazom:

composer create-project laravel/laravel LaravelApp03
Enter fullscreen mode Exit fullscreen mode

2.) v súbore ".env" si nastavím potrebnú databázu:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=db01
DB_USERNAME=root
DB_PASSWORD=***
Enter fullscreen mode Exit fullscreen mode

3.) v databáze "db01" mám v tomto momente už vytvorené db-tabuľky:

  • admins (používatelia pre druhú aplikáciu "LaravelApp02")
  • failed_jobs
  • migrations
  • password_resets (resetovanie hesiel pre druhú aplikáciu "LaravelApp02")
  • password_reset_tokens
  • personal_access_tokens
  • sessions
  • users (používatelia pre prvú aplikáciu "LaravelApp01")

a tretia Laravel aplikácia "LaravelApp03" bude mať samostatnú db-tabuľku pre svojích používateľov, napr."members"

4.) v tretej aplikácii si zinštalovať package "JetStream" príkazom:

composer require laravel/jetstream
Enter fullscreen mode Exit fullscreen mode

nasleduje príkaz:

php artisan jetstream:install livewire
Enter fullscreen mode Exit fullscreen mode

čo vytvorí migračné skripty, zinštaluje package "livewire/livewire" a (aktualizuje) niektoré ďalšie package, a vypublikuje asset-y a vybuild-uje aplikáciu.

5.) v existujúcom migračnom skripte:

\database\migrations\2014_10_12_000000_create_users_table.php
Enter fullscreen mode Exit fullscreen mode

si upraviť kód - zmena názvu db-tabuľky z "users" na "members":

...
return new class extends Migration  {
    public function up(): void    {
        Schema::create('members', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->foreignId('current_team_id')->nullable();
            $table->string('profile_photo_path', 2048)->nullable();
            $table->timestamps();
        });
    }
    public function down(): void    {
        Schema::dropIfExists('members');
    }
};
Enter fullscreen mode Exit fullscreen mode

6.) a kvôli konzistencii si premenovať aj tento migračný súbor, tj.z:

\database\migrations\2014_10_12_000000_create_users_table.php
Enter fullscreen mode Exit fullscreen mode

premenovať na:

\database\migrations\2014_10_12_000000_create_members_table.php
Enter fullscreen mode Exit fullscreen mode

7.) teraz možno spustiť samotnú migráciu:

php artisan migrate
Enter fullscreen mode Exit fullscreen mode

a v databáze "db01" je vytvorená nová db-tabuľka "members"

8.) ešte je potrebné zmeniť/doplniť v modeli "User":

\app\Models\User.php
Enter fullscreen mode Exit fullscreen mode

doplniť názov db-tabuľky s ktorou má pracovať:

...
class User extends Authenticatable  {
    use HasApiTokens;
    use HasFactory;
    ...
    protected $table = 'members';
    ...
Enter fullscreen mode Exit fullscreen mode

9.) a doplniť ešte do súboru:

\config\auth.php
Enter fullscreen mode Exit fullscreen mode

odkaz/referenciu na používanú db-tabuľku:

<?php
return [
    'table' => 'members',
    ...
Enter fullscreen mode Exit fullscreen mode

10.) ak teraz spustím developovací server v rámci tretej aplikácie "LaravelApp03" a v prehliadači URL:

http://localhost:8000/
Enter fullscreen mode Exit fullscreen mode

viem sa registrovať (a následne aj prihlásiť) do tejto Laravel aplikácie, a data sa zapisujú do db-tabuľky "members"

11.) mám takto vytvorené tri nezávislé aplikácie "LaravelApp01", "LaravelApp02" a "LaravelApp03", každá z nich má vlastný autentifikačný systém ("LaravelApp01" a "LaravelApp03" majú package "JetStream" a "LaravelApp02" má "bootstrap/ui") a každá z nich si svojích používateľov uchováva v samostatnej db-tabuľke ("LaravelApp01" v db-tabuľke "users", "LaravelApp02" v db-tabuľke "admins" a "LaravelApp03" v db-tabuľke "members"). Zároveň ostatné db-tabuľky (a data) môžem rovnocenne použiť vo všetkých troch aplikáciách.

Top comments (0)