LaravelTutorial: Unterschied zwischen den Versionen

Aus Vokabulabor
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 86: Zeile 86:
</pre>
</pre>
* Browser aktualisieren (F5)
* Browser aktualisieren (F5)
== Datenbank anlegen ==
* Mit mysql die Datenbank dbnotes mit Benutzer notes und Passwort 'TopSecret' anlegen, z.B. mit
<pre>
sudo mysql mysql <<EOS
CREATE DATABASE dbnotes;
GRANT ALL ON dbnotes.* to 'notes'@'localhost' IDENTIFIED BY 'TopSecret';
EOS
</pre>
* In der Datei .env:
<pre>
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dbnotes
DB_USERNAME=notes
DB_PASSWORD='TopSecret'
</pre>


== UserController erstellen ==
== UserController erstellen ==
Zeile 140: Zeile 122:
** Nichts eingeben, auf Button "Register" klicken: nichts passiert
** Nichts eingeben, auf Button "Register" klicken: nichts passiert
** Alle 3 Felder ausfüllen und dann Button "Register" klicken: Fehlermeldung, dass Benutzer nicht angemeldet ist. Das ist so korrekt, die Validierung ist demnach korrekt durchlaufen.
** Alle 3 Felder ausfüllen und dann Button "Register" klicken: Fehlermeldung, dass Benutzer nicht angemeldet ist. Das ist so korrekt, die Validierung ist demnach korrekt durchlaufen.
== Datenbank anlegen ==
* Mit mysql die Datenbank dbnotes mit Benutzer notes und Passwort 'TopSecret' anlegen, z.B. mit
<pre>
sudo mysql mysql <<EOS
CREATE DATABASE dbnotes;
GRANT ALL ON dbnotes.* to 'notes'@'localhost' IDENTIFIED BY 'TopSecret';
EOS
</pre>
* In der Datei .env:
<syntaxhighlight lang="bash">
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dbnotes
DB_USERNAME=notes
DB_PASSWORD='TopSecret'
</syntaxhighlight>
== Datenbank initialisieren ==
* Laravel hat schon einige DB-Elemente vorbereitet. Diese werden so aktiviert:
<syntaxhighlight lang="bash">
php artisan migrate
mysql -u notes -pTopSecret dbnotes <<EOS
show tables;
select * from users;
EOS
</syntaxhighlight>
* Es werden die Tabellen failed_jobs migrations password_reset_tokens personal_access_tokens und users angelegt.
* Die Tabelle users ist leer.
== Registrierung fertigstellen ==
* Änderung in app/Http/UserController.php:
<pre>
    public function register(Request $request) {   
        $incomingFields = $request->validate([
            'name' => ['required', 'min:3', 'max:10', Rule::unique('users', 'name')],
            'email' => ['required', 'email', Rule::unique('users', 'email')],
            'password' => 'required'
        ]);
        $incomingFields['password'] = bcrypt($incomingFields['password']);
        $user = User::create($incomingFields);
        auth()->login($user);
        return redirect('/');
    }
</pre>
* "User::" doppelklicken, Alt-Ctrl-i importiert die Klasse App\Models\User
* Browser: F5, Felder ausfüllen, Button "Register"
<syntaxhighlight lang="bash">
mysql -u notes -pTopSecret dbnotes <<EOS
select * from users;
EOS
</syntaxhighlight>
* Jetzt ist ein Datensatz in der Datenbank, der passende Benutzer
* Fülle das Formular nochmal mit anderen Daten aus, damit 2 Benutzer existieren.
== Logout und Login ==
* In resources/home.blade.php:
<pre>
<body>
@auth
  <form action="/logout" method="POST">
    @csrf
    <p>You are logged in!</p>
    <button>logout</button>
  </form>
@else
  <div style="border: 3px solid black;">
    <h2>Register</h2>
    <form action="/register" method="POST">
      @csrf
      <input name="name" type="text" placeholder="name">
      <input name="email" type="text" placeholder="email">
      <input name="password" type="password" placeholder="password">
      <button>Register</button>
    </form>
  </div>
  <div style="border: 3px solid black;">
    <h2>Login</h2>
    <form action="/login" method="POST">
      @csrf
      <input name="loginname" type="text" placeholder="name">
      <input name="loginpassword" type="password" placeholder="password">
      <button>Login</button>
    </form>
  </div>
@endauth
</body>
</pre>
* Änderung in app/Http/UserController.php:
<pre>
    public function logout()
    {
        auth()->logout();
        return redirect('/');
    }
    public function login(Request $request)
    {
        $incomingFields = $request->validate([
            'loginname' => 'required',
            'loginpassword' => 'required'
        ]);
        $incomingFields['loginpassword'] = bcrypt($incomingFields['loginpassword'] . $incomingFields['loginname']);
        if (
            auth()->attempt([
                'name' => $incomingFields['loginname'],
                'password' => $incomingFields['loginpassword']
            ])
        ) {
            $request->session()->regenerate();
        }
        return redirect('/');
    }
</pre>
* Änderung in routes/web.php:
<pre>
Route::post('/register', [UserController::class, 'register']);
Route::post('/login', [UserController::class, 'login']);
Route::post('/logout', [UserController::class, 'logout']);
</pre>

Version vom 24. September 2023, 15:16 Uhr

Links

Zielsetzung

Es wird eine Webapplikation "Notes" gebaut, die folgende grundlegende Fähigkeiten hat:

  • Registrierung mit Name, Email und Passwort. Speichern in einer Datenbank.
  • Login mit Name und Passwort, Abgleich mit Datenbank
  • Logout
  • Erstellen einer Notiz mit Titel und Nachricht
  • Anzeige aller Notizen des Benutzers
  • Edieren der Notiz
  • Löschen der Notiz

Voraussetzungen

  • Visual Studio Code ist installiert, ebenso die Erweiterungen PHP, PHP Namespace Resolver, Laravel Blade Snippets
  • Composer ist installiert.

Vorgehen

Erstellen des Projekts

PROJ=notes
BASE=/home/ws/php/$PROJ
mkdir -p $BASE
cd $BASE
composer create-project laravel/laravel .
  • Damit wird ein Verzeichnis $BASE/notes erstellt, und mittels Composer das Grundgerüst der Applikation erstellt.
  • Es steht dann das PHP-Script **artisan** zur Verfügung, mit dem Laravel-Kommandos gegeben werden können.
  • Interessant ist auch die Datei .env, in der die Konfiguration der Applikation stattfindet.

Starten des Webservers

Es gibt einen eingebauten Webserver für die Entwicklung:

cd $BASE
./artisan serve

Die Applikation steht dann im Browser unter http://localhost:8000 zur Verfügung.

Modifizieren der Homepage

  • Die erstellte Homepage steht in der Datei resources/views/welcome.blade.php
  • Diese Datei öffnen und im Quelltext was ändern
  • Im Browser F5 drücken, der geänderte Text wird sichtbar

Neue Homepage erstellen

  • Neue Datei: resources/views/home.blade.php Wichtig: endet immer mit .blade.php
  • Eintippen: ! Es erscheint ein Icon "Schraubenschlüssel" mit Titel !. Dieses anklicken. Damit wird ein HTML-Grundgerüst erstellt.
  • Titel korigieren: <title>Notes</title>
  • Im Body:
<h1>Test</h1>
  • Speichern
  • Datei routes/web.php
Route::get('/', function () {
    return view('welcome');
});
  • Hier steht der Aufruf der Datei welcome.blade.php
  • Wir ersetzen das durch unsere eigene Datei home.blade.php:
Route::get('/', function () {
    return view('home');
});

Das Registrier-Formular

  • resources/views/home.blade.php
<div style="border: 3px solid black;">
 <h2>Register</h2>
 <form action="/register" method="POST">
  @csrf
 <input name="name" type="text" placeholder="name">
 <input name="email" type="text" placeholder="email">
 <input name="password" type="password" placeholder="password">
 <button>Register</button>
 </form>
 </div>
  • /routes/web.php:
Route::post('/register', function() { return 'We have registered'; });
  • Browser aktualisieren (F5)

UserController erstellen

  • Die Behandlung des Formulars passiert in einem "Controller"
php artisan make:controller UserController
  • Es entsteht die Datei app/Http/Controllers/UserController
  • Wir erweitern die Klasse UserController um eine Methode register(), die die Registrierung vornimmt:
class UserController extends Controller
{
    public function register(Request $request) {
        $incomingFields = $request->validate([
            'name' => ['required', 'min:3', 'max:10', Rule::unique('users', 'name')],
            'email' => ['required', 'email', Rule::unique('users', 'email')],
            'password' => 'required'
        ]);
        return 'Hello from UserController';
    }
}
  • Die Methode bekommt den Parameter $request, der die HTML-Infos der Seite enthält.
  • Der Aufruf von $request->validate() stellt Überprüfungen an:
    • In dem assoziativen Feld werden die zu überprüfenden Felder mit den Validierungsregeln verknüpft:
    • Das Feld "name" darf nicht leer sein ("required"), der Name muss mindestens 3 und darf maximal 10 Zeichen lang sein, der Name darf noch nicht in der DB in der Tabelle 'users' im Feld 'name' vorkommen.
  • Damit PHP die Klasse Rules in der Datei UserController.php kennt: Doppelklick auf Rule (Auswählen), dann Alt-Ctr-I (Import Class). In der Liste Illuminate\validation\Rule auswählen.
  • In der Datei routes/web.php:
Route::post('/register', [UserController::class, 'register']; });
  • Mit der URL /register wird die Methode 'register' in der Klasse UserController aufgerufen.
  • Damit PHP die Klasse UserController in der Datei web.php kennt: UserController doppelklicken (Auswählen): Rechte Maustaste: "Import Class" (oder Alt-Ctr-I). Es wird dann der Import erledigt.
  • Browser mit F5 aktualisieren:
    • Nichts eingeben, auf Button "Register" klicken: nichts passiert
    • Alle 3 Felder ausfüllen und dann Button "Register" klicken: Fehlermeldung, dass Benutzer nicht angemeldet ist. Das ist so korrekt, die Validierung ist demnach korrekt durchlaufen.

Datenbank anlegen

  • Mit mysql die Datenbank dbnotes mit Benutzer notes und Passwort 'TopSecret' anlegen, z.B. mit
sudo mysql mysql <<EOS
CREATE DATABASE dbnotes;
GRANT ALL ON dbnotes.* to 'notes'@'localhost' IDENTIFIED BY 'TopSecret';
EOS
  • In der Datei .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dbnotes
DB_USERNAME=notes
DB_PASSWORD='TopSecret'

Datenbank initialisieren

  • Laravel hat schon einige DB-Elemente vorbereitet. Diese werden so aktiviert:
php artisan migrate
mysql -u notes -pTopSecret dbnotes <<EOS
show tables;
select * from users;
EOS
  • Es werden die Tabellen failed_jobs migrations password_reset_tokens personal_access_tokens und users angelegt.
  • Die Tabelle users ist leer.

Registrierung fertigstellen

  • Änderung in app/Http/UserController.php:
    public function register(Request $request) {    
        $incomingFields = $request->validate([
            'name' => ['required', 'min:3', 'max:10', Rule::unique('users', 'name')],
            'email' => ['required', 'email', Rule::unique('users', 'email')],
            'password' => 'required'
        ]);
        $incomingFields['password'] = bcrypt($incomingFields['password']);
        $user = User::create($incomingFields);
        auth()->login($user);
        return redirect('/');
    }
  • "User::" doppelklicken, Alt-Ctrl-i importiert die Klasse App\Models\User
  • Browser: F5, Felder ausfüllen, Button "Register"
mysql -u notes -pTopSecret dbnotes <<EOS
select * from users;
EOS
  • Jetzt ist ein Datensatz in der Datenbank, der passende Benutzer
  • Fülle das Formular nochmal mit anderen Daten aus, damit 2 Benutzer existieren.

Logout und Login

  • In resources/home.blade.php:
<body>
@auth
  <form action="/logout" method="POST">
    @csrf
    <p>You are logged in!</p>
    <button>logout</button>
  </form>
@else
  <div style="border: 3px solid black;">
    <h2>Register</h2>
    <form action="/register" method="POST">
      @csrf
      <input name="name" type="text" placeholder="name">
      <input name="email" type="text" placeholder="email">
      <input name="password" type="password" placeholder="password">
      <button>Register</button>
    </form>
  </div>
  <div style="border: 3px solid black;">
    <h2>Login</h2>
    <form action="/login" method="POST">
      @csrf
      <input name="loginname" type="text" placeholder="name">
      <input name="loginpassword" type="password" placeholder="password">
      <button>Login</button>
    </form>
  </div>
@endauth
</body>
  • Änderung in app/Http/UserController.php:
    public function logout()
    {
        auth()->logout();
        return redirect('/');
    }
    public function login(Request $request)
    {
        $incomingFields = $request->validate([
            'loginname' => 'required',
            'loginpassword' => 'required'
        ]);
        $incomingFields['loginpassword'] = bcrypt($incomingFields['loginpassword'] . $incomingFields['loginname']);
        if (
            auth()->attempt([
                'name' => $incomingFields['loginname'],
                'password' => $incomingFields['loginpassword']
            ])
        ) {
            $request->session()->regenerate();
        }
        return redirect('/');
    }
  • Änderung in routes/web.php:
Route::post('/register', [UserController::class, 'register']);
Route::post('/login', [UserController::class, 'login']);
Route::post('/logout', [UserController::class, 'logout']);