A kozossegek.hu egy katolikus közösségkereső portál, amelyet azért hoztunk létre, hogy segítsünk mindenkinek megtalálni a közösségét akárhol is éljen, tanuljon, vagy dolgozzon, nemtől, kortól, életállapottól függetlenül.
A projekt publikussá tételével szeretnénk másokat is bevonni a közös munkába, fejlesztésbe, hogy még hatékonyabb legyen az oldal karbantartása, az újdonságok elkészítése, esetleg mások ötleteit is meg tudjuk valósítani.
Minden építő jellegű ötletet, fejlesztést örömmel fogadunk issue-k és pull requestek formájában!
Részletes fejlesztői dokumentáció jelenleg nincs, de idővel igyekszünk ennek is eleget tenni.
php8.1mariadbhtml,css
- Docker. Telepítése: https://docs.docker.com/engine/install/
(app port: 8000, pma port: 8001, username: admin, password: pw, email: amit lent megadsz)
git clone git@github.com:baueri/kozossegek-hu.git \
&& cd kozossegek-hu \
&& cp .env.example .env \
&& docker compose up -d --buildMiután elindult a docker container, telepítéshez futtasd ezt:
docker exec kozossegek_app php console install --name=Admin --username=admin --email="your.eamil@kozossegek.hu" --password=pw --seedKlónozd le a projektet, majd lépj be a könyvtárba
git clone git@github.com:baueri/kozossegek-hu.gitMásold le a .env.example tartalmát a .env fájlba
cp .env.example .envAz alkalmazás a 8000-es, a phpmyadmin pedig a 8001-es portokon lesznek kiszolgálva, ha ezen változtatnál,
írd át az APP_PORT és a PMA_PORT változókat a .env fájlban.
A többi változót is igény szerint módosíthatod (sql usernév, jelszó, storage mappa stb)
Indítsd el a dockert:
docker compose up -d --buildA -d kapcsolóval a sikeres build után a háttérben fognak futni a containerek.
Miután a dockeres telepítés megtörtént, a kozossegek_app containerben futtasd az install.php-t:
docker exec kozossegek_app php install.phpA telepítőben
- létrejön az admin fiókod
- felkerül néhány dummy közösség, illetve a térkép modul és a keresőmotor frissül. Ez 1-2 percet igénybe vehet.
Ha minden sikeresen lefutott, akkor az alkalmazás a http://localhost:8000 (a port a konfigurációtól függ) linken elérhető lesz.
A kozossegek.hu projektben három containert futtatunk:
- kozossegek_app: Ide van az apache szerver felrakva, az alkalmazás innen van kiszolgálva.
- kozossegek_pma: Phpmyadmin image van behúzva. A phpmyadmin innen érhető el: http://localhost:8001
- Alapértelmezetten a user:
root, password:pwadatokkal tudsz belépni.
- Alapértelmezetten a user:
- kozossegek_mysql: Ez az sql container, szintén a fenti login adatokkal (
root, pw) lehet használni az sql cli-t.
A kozossegek.hu egyedi keretrendszer alatt fut, MVC struktúrával. Ebben a fejezetben a legalapvetőbb dolgokat írjuk le, amivel már be tudsz kapcsolódni a fejlesztésbe.
A route-ok határozzák meg az oldal belépési pontját, amik nagyrészt egy controller class adott metódusára mutatnak.
A controller osztály metódusa tartalmazza a business logic-et, amit szükség szerint lehet külön service-be is kivezetni.
A megjelenítést pedig egy saját fejlesztésű, szintaktikájában a laravel blade-jére hasonlító templating rendszer valósítja meg.
Az adatbázis táblák entitásainak kezelésére két implementációt használunk:
- Az entitások reprezentálására model osztályok
- Ezek szerkesztésére, lekérésére, létrehozására pedig a query builderek.
Az aloldalak struktúrája xml-ben írt route fájlokban vannak meghatározva. Az egyes aloldalakra vonatkozó szabályokat (engedélyezett request method, middleware) szintén itt lehet meghatározni.
Az alapvető útvonalak négy xml fájlba vannak rendezve szerepüktől függően.
routes/web.xmlroutes/api.xmlroutes/admin.xmlroutes/admin_api.xml
Új route útvonal létrehozása
Új route-ot az adott xml fájlban a <routes></routes> gyökér tag közé kell felvinni
Általános használata:
<route method="get" uri="route-to-page" controller="App\Path\To\Controller" use="routeEntrypoint"/>Ez a fenti route létrehozza a kozossegek.hu/route-to-page végpontot, ami az App\Path\To\Controller osztály routeEntrypoint metódusát fogja lefuttatni
A controller osztályokban vannak a route-ok belépési pontjai implementálva.
<?php
namespace App\Portal\Controllers;
use Framework\Http\Controller;
class MyController extends Controller
{
public function myEntryPoint(SomeService $service)
{
// some business logic here
}
}Note: dependency injection
A fenti példában is látszik, hogy a controller myEntryPoint metódusának van egy SomeService függősége.
A keretrendszer egy egyszer dependency injection resolverrel automatikusan megpróbálja rekurzívan feloldani a controller metódus függőségeit (és a függőségeinek függőségeit, ha vannak).
Ez segíthet abban, hogy egy service-t ne kelljen manuálisan példányosítani annak további függőségeivel.
Az adatbázis sorok php-s reprezentálására a Framework\Model\Entity-ből származtatott osztályokat használjuk.
Minden ilyen entity implementációnak van egy hozzá kapcsolódó query builderje is, ami a Framework\Model\EntityQueryBuilder-ből van származtatva.
Példa a használatra:
<?php
class MyController extends \Framework\Http\Controller
{
public function users(\App\QueryBuilders\Users $users)
{
return $users->where('email', 'test@gmail.com')->first();
}
}Entitás létrehozása
$user = $users->create(['name' => 'Test user', 'email', 'test@gmail.com']); // egy User példányt ad visszaEntitás adatainak frissítése
$user = $users->find(1); // egyetlen sor lekérése id alapján
$users->save($user, ['name' => 'Másik user'])Sor törlése adatbázisból
Kétféleképpen lehet törölni sort a query builder használatával:
$users->deleteModel($user); // model átadásával
// vagy
$users->where('email', 'test@gmail.com')->delete() // sql-lelNote: adott entitás query builderjét a query() metódushívással tudod példányosítani
$users = Users::query();
$users->where('...')->orderBy('name asc')->get();Természetesen van lehetőség a query builder helyett a plain sql használatára is:
$testUsers = db()->select('select * from users where name like %?%', ['test']);Fontos: plain sql esetén is mindenképp bindig-ot használjunk, ne írjunk sql-t konkatenálással
// NE CSINÁLD:
db()->first('select * from users where email="' . request()->get('email') . "'");A megjelenítést az egyedi fejlesztésű, blade által inspirált, de annál egyszerűbb template engine generálja.
Ezek is gyakorlatilag php fájlok, amik bizonyos kényelmi előnyökkel szolgálnak.
A template fájlokat a resources/views mappában tároljuk
resources/views/minta.php
@title('Ez egy minta oldal')
@extends('portal')
<h3>Hello {{ $nev }}, ez egy minta oldal...</h3>
<p>...ami köré a portal.php template fájl kerül, így erre a template-re a látogai oldal dizájnja, szerkezete kerül</p>A @title() direktíva a fejléc szekcióba jeleníti meg azt a szöveget, amit paraméterben átadunk
Az @extends() direktíva határozza meg, hogy mely másik template-et akarjuk a tartalom köré berakni. Az ez alá kerülő tartalom, html kód kerül a portal.php fájlban a @yield('portal') helyére.
Lehetőség van dinamikus tartalmat is megjeleníteni, erre a {{ $valtozo_neve }} szintaxist lehet használni.
Egy template tartalmát legegyszerűbben a view() függvényhívással lehet megjeleníteni
<?php
class MyController extends \Framework\Http\Controller
{
public function mintaOldal()
{
return view('minta', ['nev' => 'Minta János']);
}
}Iteráció egy tömbön
<ul>
@foreach($array as $value)
<li>{{ $value }}</li>
@endforeach
</ul>Feltételvizsgálat
@if($a === 'a')
@else
@endifMásik template fájl betöltése
<p>Some content</p>
@include('path.to.another.template')
<p>Some other content</p>Route linkjének lekérése
<a href="@route('admin.dashboard')">Admin felület</a>- https://www.toptal.com/developers/css/sprite-generator: a címkék (jellemzők) sprite-tá alalkításához. 35x35 px-es képekkel!