Taskx mittels Laraknife: Unterschied zwischen den Versionen

Aus Vokabulabor
Zur Navigation springen Zur Suche springen
 
(87 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 2: Zeile 2:
* [[Laraknife]]
* [[Laraknife]]
* [[Laravel]]
* [[Laravel]]
* [[LaraKnife Kochbuch]]
* [[Deployment Laraknife Projekt]]


= Zielsetzung =
= Zielsetzung =
Zeile 12: Zeile 14:
* Benutzerverwaltung: nur angemeldete Benutzer können Applikation nutzen
* Benutzerverwaltung: nur angemeldete Benutzer können Applikation nutzen
* Rechteverwaltung mittels Rollen
* Rechteverwaltung mittels Rollen
* Verwaltung von Notizen: Titel, Text, Kategorie, Text, Status: offen, erledigt
* Verwaltung von Notizen: Titel, Text, Kategorie, Status: offen, erledigt


= Installation =
= Installation =
* php muss installiert sein! [[PHP einrichten]] php-sqlite3
* mariadb muss installiert sein: [[mysql]]
* als normaler Benutzer (nicht root):
* als normaler Benutzer (nicht root):
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sudo apt install php-laravel-framework npm php-intl
PROJ=taskx


PROJ=taskx
SCRIPT=/var/tmp/CreateLaraProj.sh
wget "https://public.hamatoma.de/public/CreateLaraProj.sh" -O $SCRIPT
chmod +x $SCRIPT
PASSW=topsecret
PASSW=topsecret
BASE=/home/ws/php/$PROJ
BASE=/home/ws/php
cd $(dirname $BASE)
sudo apt update
composer create-project laravel/laravel $PROJ
sudo apt install composer -y
cd $BASE
 
composer require laravel/ui
$SCRIPT $PROJ "$PASSW" "$BASE"
composer require spatie/laravel-permission
</syntaxhighlight>
php artisan ui bootstrap --auth
* Am Ende wird dazu aufgefordert, das Script /tmp/IncludeLara.sh zu starten:
dbtool create-db-and-user lrv$PROJ $PROJ "$PASSW"
<syntaxhighlight lang="bash">
sed -i -e "s/DB_DATABASE=.*/DB_DATABASE=lrv$PROJ/" \
# wget https://public.hamatoma.de/public/IncludeLara.sh -O /tmp/IncludeLara.sh
  -e "s/DB_USERNAME=.*/DB_USERNAME=$PROJ/" \
# chmod +x /tmp/IncludeLara.sh
  -e "s/DB_PASSWORD=.*/DB_PASSWORD=$PASSW/" .env
/tmp/IncludeLara.sh $BASE/$PROJ local
M_HOST=mail.gmx.net
# oder
M_PORT=587
/tmp/IncludeLara.sh $BASE/$PROJ git
M_USER=example@gmx.de
</syntaxhighlight>
M_PW=Top.Secret42
 
sed -i \
== Restliche Installation ==
  -e "s/APP_NAME=.*/APP_NAME=$PROJ"/ \
<syntaxhighlight lang="bash">
  -e "s/MAIL_MAILER=.*/MAIL_MAILER=smtp/" \
cd $BASE/$PROJ
  -e "s/MAIL_HOST=.*/MAIL_HOST=$M_HOST/" \
larascripts/laraknife-tool.sh rest
  -e "s/MAIL_PORT=.*/MAIL_PORT=$M_PORT/" \
 
  -e "s/MAIL_USERNAME=.*/MAIL_USERNAME=$M_USER/" \
./Own.sh all
  -e "s/MAIL_PASSWORD=.*/MAIL_PASSWORD=$M_PW/" \
  -e "s/MAIL_ENCRYPTION=.*/MAIL_ENCRYPTION=STARTTLS/" \
  -e "s/MAIL_FROM_ADDRESS=.*/MAIL_FROM_ADDRESS=\"$M_USER\"/" .env
sudo sed -i -e "3 i 127.0.0.1 $PROJ.test" /etc/hosts
grep "$PROJ.test" /etc/hosts
php artisan migrate
npm install
npm run dev
# Abbruch mit Strg-C
</syntaxhighlight>
</syntaxhighlight>


== Einrichten LaraKnife ==
Das folgende sind die einzelnen Schritte, '''normalerweise nicht''' erforderlich:
 
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sed -i \
# Links erstellen/auffrischen:
  -e '/"laravel.ui"/ s=^=        "hamatoma/laraknife": "dev-main",<nl>=' \
larascripts/laraknife-tool.sh build-links [--force]
  -e '/^ *"autoload/ s=^= "repositories": [<nl>  {"type": "vcs", "url": "https://github.com/hamatoma/laraknife" }<nl> ],<nl>=' \
# Mehrsprachigkeit
  -e "s/<nl>/\\n/g" composer.json
larascripts/laraknife-tool.sh init-i18n
composer update
# Die neuen Übersetzungen müssen in resources/lang/sources/taskx.de.json eingetragen werden.
vendor/hamatoma/laraknife/scripts/laraknife-tool.sh build-links
# Roles und SProperties füllen
larascripts/laraknife-tool.sh fill-db
# Laraknife-Module anpassen
larascripts/laraknife-tool.sh adapt-modules
# Layout erstellen
larascripts/laraknife-tool.sh create-layout
# Homepage einrichten
larascripts/laraknife-tool.sh create-home
</syntaxhighlight>
</syntaxhighlight>


= Starten Webserver =
= Entwicklungsumgebung starten =
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
cd /home/ws/php/taskx
./Build
# In einem ANDEREN Terminal:
php artisan serve
php artisan serve
</syntaxhighlight>
</syntaxhighlight>
* Im Browser: http://localhost:8000


= Modul Notes erstellen =
= Modul Device erstellen =
== Tabellenbeschreibung erstellen ==
== Tabellenbeschreibung erstellen ==
* Konvention: Tabelle wird kleingeschrieben, im Plural
* Konvention: Tabelle wird kleingeschrieben, im Plural
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
TABLE=notes
TABLE=devices
php artisan make:migration create_${TABLE}_table
php artisan make:migration create_${TABLE}_table
</syntaxhighlight>
</syntaxhighlight>
* Es wird die Datei database/migrations/2023_12_29_180821_create_notes_table.php erzeugt
* Es wird die Datei database/migrations/2023_12_29_180821_create_devices_table.php erzeugt, wobei Datum/Uhrzeit bei jeder Generierung anders ist.
* Diese Datei anpassen:
* Diese Datei anpassen:
<pre>
<pre>
         Schema::create('notes', function (Blueprint $table) {
         Schema::create('devices', function (Blueprint $table) {
             $table->id();
             $table->id();
             $table->timestamps();
             $table->timestamps();
             $table->string('title');
             $table->string('name');
             $table->text('body');
             $table->text('description');
            // foreign key of sproperties.
             $table->integer('devicegroup_scope');
             $table->integer('category_id');
             $table->foreignId('owner_id')->nullable()->references('id')->on('users');
            // foreign key of sproperties.
             $table->integer('status_id');
            // foreign key of sproperties.
            $table->integer('group_id');
            $table->foreignId('user_id')->references('id')->on('users')->nullable();
         });
         });
    }
</pre>
</pre>
* Syntax für Feldänderungen: [[Datenbank-Laravel#Feld%C3%A4nderungen]]
== Modul erzeugen ==
== Modul erzeugen ==
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
php artisan migrate
php artisan migrate
./Lara create:module database/migrations/2023_12_29_180821_create_notes_table.php
 
./Lara create:module database/migrations/*_create_${TABLE}_table.php
# oder, wenn das Modul nicht automatisch gebildet werden kann:
./Lara create:module database/migrations/*_create_${TABLE}_table.php --module=device
 
 
php artisan migrate
</syntaxhighlight>
 
== Database Seeder ==
Um Tabellen mit sinnvollen Daten vorzubelegen, werden '''Database Seeder''' verwendet.
<syntaxhighlight lang="bash">
php artisan make:seeder DeviceSeeder
</syntaxhighlight>
</syntaxhighlight>
Die entstehende Datei database/seeders/DeviceSeeder.php anpassen: Icons in https://icons.getbootstrap.com
<pre>
    public function run(): void
    {
        SProperty::insertIfNotExists(2001, 'devicegroup', 'Computer', 10, 'C');
        SProperty::insertIfNotExists(2002, 'devicegroup', 'Router', 20, '$');
        Menuitem::insertIfNotExists('articles', 'bi bi-journals');
        Module::insertIfNotExists('Article');
    }
</pre>
Aktivieren:
<syntaxhighlight lang="bash">
php artisan db:seed --class=DeviceSeeder
</syntaxhighlight>
== Routing einrichten ==
* In Datei routes/web.php einfügen:
<syntaxhighlight lang="php">
...
DeviceController::routes();
...
</syntaxhighlight>
* Die Klasse NodeController ist unterstrichen: mit Strg-Alt-I Klassen einbinden.


== Roles und SProperties füllen ==
== Starten, Registrieren, Login ==
* Den Webserver starten:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
sudo mysql lrv$PROJ <<'EOS'
./Build
insert into roles (name, priority, created_at, updated_at) values
# in einem anderen Terminal:
('Administrator', 10, '2023.12.28', '2023-12-28'),
php artisan serve
('Manager', 20, '2023.12.28', '2023-12-28'),
</syntaxhighlight>
('User', 30, '2023.12.28', '2023-12-28'),
* Im Brower aufrufen: http://localhost:8000
('Guest', 90, '2023.12.28', '2023-12-28');
* Oben rechts: Register
insert into sproperties (id, scope, name, `order`, shortname, created_at) values
* Felder ausfüllen
(1001, 'status', 'active', 10, 'A', '2023-12-28'),
* Oben rechts: Login
(1002, 'status', 'inactive', 20, 'I', '2023-12-28'),
 
(2001, 'category', '<none>', 10, '-', '2023-12-28'),
== In Homepage einfügen ==
(2002, 'category', 'private', 20, 'P', '2023-12-28'),
* resources/views/home.blade.php:
(2003, 'category', 'work', 30, 'W', '2023-12-28'),
<pre>
(2501, 'group', '<none>', 10, '-', '2023-12-28'),
<li><a href="/device-index">Geräte</a></li>
(2502, 'group', 'private', 20, 'P', '2023-12-28'),
</pre>
(2503, 'group', 'work', 20, 'W', '2023-12-28'),
 
(2601, 'notestatus', 'open', 10, 'O', '2023-12-28'),
== Controller und Views anpassen ==
(2602, 'notestatus', 'closed', 20, 'C', '2023-12-28');
=== Übersicht (index) ===
EOS
* Datei app/Http/Controllers/DeviceController.php
<syntaxhighlight lang="php">
    public function index()
    {
    }
</syntaxhighlight>
* Datei resources/views/device/index.blade.php
<syntaxhighlight lang="html">
<form id="device-index" action="/device-index" method="POST">
    @csrf
</syntaxhighlight>
 
=== Anlegen (create) ===
* Datei app/Http/Controllers/DeviceController.php
* Die drei Methoden '''ersetzen''':
<syntaxhighlight lang="php">
</syntaxhighlight>
 
* Datei resources/views/device/create.blade.php
<syntaxhighlight lang="html">
</syntaxhighlight>
* Übersetzungen in resources/lang/sources/taskx.de.json
<pre>
"Devices": "Geräte",
</pre>
* Aktivieren:
<syntaxhighlight lang="bash">
./Join
</syntaxhighlight>
 
=== Ändern (edit) ===
* Datei app/Http/Controllers/DeviceController.php
<syntaxhighlight lang="php">
    public function edit(Device $device)
    {
    }
    public function update(Device $device, Request $request)
    {
        $rc = null;
        return $rc;
    }
</syntaxhighlight>
 
* Datei resources/views/device/edit.blade.php
<syntaxhighlight lang="html">
</syntaxhighlight>
 
* Übersetzungen in resources/lang/sources/taskx.de.json
<pre>
"Change of a Device": "Ändern eines Gerätes",
</pre>
* Aktivieren:
<syntaxhighlight lang="bash">
./Join
</syntaxhighlight>
 
=== Anzeigen (show/delete) ===
* Datei app/Http/Controllers/DeviceController.php
<syntaxhighlight lang="php">
    public function show(Device $device)
    {
    }
</syntaxhighlight>
 
* Datei resources/views/device/show.blade.php
<syntaxhighlight lang="html">
</syntaxhighlight>
* Übersetzungen in resources/lang/sources/taskx.de.json
<pre>
"A Device" : "Ein Gerät",
"Deletion of a Device": "Löschen eines Gerätes",
</pre>
* Aktivieren:
<syntaxhighlight lang="bash">
./Join
</syntaxhighlight>
 
= Neue Instanz von taskx einrichten =
* Lokal:
<syntaxhighlight lang="bash">
PROJ=taskx
BASE=/home/ws/php
cd $BASE
git clone ssh://git@git.hamatoma.de:/home/git/repo/$PROJ.git
cd $PROJ
scripts/InitApp.sh
</syntaxhighlight>
 
* auf einem Server:
<syntaxhighlight lang="bash">
PROJ=taskx
DOMAIN=$PROJ.hamatoma.de
BASE=/srv/www
cd $BASE
sudo -u www-data git config --global --add safe.directory /home/git/repo/$PROJ.git
sudo -u www-data git clone /home/git/repo/$PROJ.git
mv $PROJ $DOMAIN
cd $DOMAIN
sudo -u www-data git checkout main
../laraknife/scripts/InstallInitApp.sh
 
echo "DEV_USER=www-data" >.env.user
./Own.sh all
 
cp .env.example .env
vi .env
bash scripts/InitApp.sh
 
sudo -u www-data ./Build prod
sudo -u www-data ./artisan key:generate
</syntaxhighlight>
</syntaxhighlight>

Aktuelle Version vom 3. Januar 2025, 21:21 Uhr

Links

Zielsetzung

Es soll eine minimale Web-Applikation mit den Werkzeugen Laravel und Laraknife erstellt werden: Eine Verwaltung von Notizen.

Name

Eine Verballhornung des Wortes "Tasks": Die schwäbische Aussprache spricht ein x am Ende.

Eigenschaften

  • Benutzerverwaltung: nur angemeldete Benutzer können Applikation nutzen
  • Rechteverwaltung mittels Rollen
  • Verwaltung von Notizen: Titel, Text, Kategorie, Status: offen, erledigt

Installation

  • php muss installiert sein! PHP einrichten php-sqlite3
  • mariadb muss installiert sein: mysql
  • als normaler Benutzer (nicht root):
PROJ=taskx

SCRIPT=/var/tmp/CreateLaraProj.sh
wget "https://public.hamatoma.de/public/CreateLaraProj.sh" -O $SCRIPT
chmod +x $SCRIPT
PASSW=topsecret
BASE=/home/ws/php
sudo apt update
sudo apt install composer -y

$SCRIPT $PROJ "$PASSW" "$BASE"
  • Am Ende wird dazu aufgefordert, das Script /tmp/IncludeLara.sh zu starten:
# wget https://public.hamatoma.de/public/IncludeLara.sh -O /tmp/IncludeLara.sh
# chmod +x /tmp/IncludeLara.sh
/tmp/IncludeLara.sh $BASE/$PROJ local
# oder
/tmp/IncludeLara.sh $BASE/$PROJ git

Restliche Installation

cd $BASE/$PROJ
larascripts/laraknife-tool.sh rest

./Own.sh all

Das folgende sind die einzelnen Schritte, normalerweise nicht erforderlich:

# Links erstellen/auffrischen:
larascripts/laraknife-tool.sh build-links [--force]
# Mehrsprachigkeit
larascripts/laraknife-tool.sh init-i18n
# Die neuen Übersetzungen müssen in resources/lang/sources/taskx.de.json eingetragen werden.
# Roles und SProperties füllen
larascripts/laraknife-tool.sh fill-db
# Laraknife-Module anpassen
larascripts/laraknife-tool.sh adapt-modules
# Layout erstellen
larascripts/laraknife-tool.sh create-layout
# Homepage einrichten
larascripts/laraknife-tool.sh create-home

Entwicklungsumgebung starten

cd /home/ws/php/taskx
./Build
# In einem ANDEREN Terminal:
php artisan serve

Modul Device erstellen

Tabellenbeschreibung erstellen

  • Konvention: Tabelle wird kleingeschrieben, im Plural
TABLE=devices
php artisan make:migration create_${TABLE}_table
  • Es wird die Datei database/migrations/2023_12_29_180821_create_devices_table.php erzeugt, wobei Datum/Uhrzeit bei jeder Generierung anders ist.
  • Diese Datei anpassen:
        Schema::create('devices', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
            $table->string('name');
            $table->text('description');
            $table->integer('devicegroup_scope');
            $table->foreignId('owner_id')->nullable()->references('id')->on('users');
        });
    }

Modul erzeugen

php artisan migrate

./Lara create:module database/migrations/*_create_${TABLE}_table.php
# oder, wenn das Modul nicht automatisch gebildet werden kann:
./Lara create:module database/migrations/*_create_${TABLE}_table.php --module=device


php artisan migrate

Database Seeder

Um Tabellen mit sinnvollen Daten vorzubelegen, werden Database Seeder verwendet.

php artisan make:seeder DeviceSeeder

Die entstehende Datei database/seeders/DeviceSeeder.php anpassen: Icons in https://icons.getbootstrap.com

    public function run(): void
    {
        SProperty::insertIfNotExists(2001, 'devicegroup', 'Computer', 10, 'C');
        SProperty::insertIfNotExists(2002, 'devicegroup', 'Router', 20, '$');
        Menuitem::insertIfNotExists('articles', 'bi bi-journals');
        Module::insertIfNotExists('Article');
    }

Aktivieren:

php artisan db:seed --class=DeviceSeeder

Routing einrichten

  • In Datei routes/web.php einfügen:
...
DeviceController::routes();
...
  • Die Klasse NodeController ist unterstrichen: mit Strg-Alt-I Klassen einbinden.

Starten, Registrieren, Login

  • Den Webserver starten:
./Build
# in einem anderen Terminal:
php artisan serve

In Homepage einfügen

  • resources/views/home.blade.php:
<li><a href="/device-index">Geräte</a></li>

Controller und Views anpassen

Übersicht (index)

  • Datei app/Http/Controllers/DeviceController.php
    public function index()
    {
    }
  • Datei resources/views/device/index.blade.php
<form id="device-index" action="/device-index" method="POST">
    @csrf

Anlegen (create)

  • Datei app/Http/Controllers/DeviceController.php
  • Die drei Methoden ersetzen:
  • Datei resources/views/device/create.blade.php
  • Übersetzungen in resources/lang/sources/taskx.de.json
"Devices": "Geräte",
  • Aktivieren:
./Join

Ändern (edit)

  • Datei app/Http/Controllers/DeviceController.php
    public function edit(Device $device)
    {
    }
    public function update(Device $device, Request $request)
    {
        $rc = null;
        return $rc;
    }
  • Datei resources/views/device/edit.blade.php
  • Übersetzungen in resources/lang/sources/taskx.de.json
"Change of a Device": "Ändern eines Gerätes",
  • Aktivieren:
./Join

Anzeigen (show/delete)

  • Datei app/Http/Controllers/DeviceController.php
    public function show(Device $device)
    {
    }
  • Datei resources/views/device/show.blade.php
  • Übersetzungen in resources/lang/sources/taskx.de.json
"A Device" : "Ein Gerät",
"Deletion of a Device": "Löschen eines Gerätes",
  • Aktivieren:
./Join

Neue Instanz von taskx einrichten

  • Lokal:
PROJ=taskx
BASE=/home/ws/php
cd $BASE
git clone ssh://git@git.hamatoma.de:/home/git/repo/$PROJ.git
cd $PROJ
scripts/InitApp.sh
  • auf einem Server:
PROJ=taskx
DOMAIN=$PROJ.hamatoma.de
BASE=/srv/www
cd $BASE
sudo -u www-data git config --global --add safe.directory /home/git/repo/$PROJ.git
sudo -u www-data git clone /home/git/repo/$PROJ.git
mv $PROJ $DOMAIN
cd $DOMAIN
sudo -u www-data git checkout main
../laraknife/scripts/InstallInitApp.sh

echo "DEV_USER=www-data" >.env.user
./Own.sh all

cp .env.example .env
vi .env
bash scripts/InitApp.sh

sudo -u www-data ./Build prod
sudo -u www-data ./artisan key:generate