Tworzenie i uruchamianie projektu Zend Framework (Laminas) w ServBay
Wprowadzenie
Zend Framework (obecnie część Laminas Project) to potężny, otwartoźródłowy framework PHP, oferujący zestaw wysokiej jakości, obiektowych komponentów do budowy nowoczesnych aplikacji i usług webowych. Słynie z elastyczności, modularnego podejścia i wydajności, dzięki czemu świetnie sprawdza się zarówno przy prostych stronach, jak i złożonych aplikacjach korporacyjnych.
ServBay to lokalne środowisko dla programistów na macOS, które integruje PHP, różne serwery www (np. Caddy, Nginx), bazy danych (np. MySQL, PostgreSQL, MongoDB), usługi cache (np. Redis, Memcached) oraz inne narzędzia developerskie. Dzięki ServBay konfiguracja i zarządzanie tymi komponentami staje się wyjątkowo proste, co znacznie ułatwia lokalne uruchamianie różnych projektów PHP.
W tym dokumencie znajdziesz instrukcję, jak utworzyć i uruchomić projekt Zend Framework (Laminas) w ServBay oraz jak zintegrować oferowane w ServBay bazy danych i systemy cache.
Wymagania wstępne
Zanim zaczniesz, upewnij się, że:
- ServBay jest zainstalowany: Pomyślnie zainstalowałeś i uruchomiłeś ServBay na macOS. Jeśli nie, pobierz go ze strony ServBay i skorzystaj z instrukcji instalacji.
- Niezbędne pakiety: W ServBay masz zainstalowane oraz uruchomione wymagane pakiety, w tym:
- Przynajmniej jedną wersję PHP (zalecana PHP 8.x lub wyższa, jako że nowoczesne wersje Zend Framework / Laminas zwykle tego wymagają).
- Serwer www (Caddy lub Nginx).
- Composer (zwykle dołączany do ServBay).
- Bazy danych i usługi cache, z których zamierzasz korzystać (np. MySQL, PostgreSQL, Memcached, Redis). Wszystko można łatwo uruchomić z panelu ServBay.
Tworzenie projektu Zend Framework
SerwBay zaleca trzymanie projektów stron w katalogu /Applications/ServBay/www
— to pozwala mu automatycznie zarządzać i rozpoznawać witryny.
Przejdź do katalogu głównego stron
Otwórz Terminal i przejdź do rekomendowanego katalogu:
bashcd /Applications/ServBay/www
1Utwórz projekt za pomocą Composer
Composer jest już zainstalowany, więc nie trzeba go doinstalowywać. Do utworzenia nowego projektu Zend Framework (szkielet aplikacji Laminas) użyj polecenia:
bashcomposer create-project laminas/laminas-skeleton-application servbay-zend-app
1Tym sposobem aplikacja szkieletowa trafi do folderu
servbay-zend-app
, a wszystkie zależności zostaną zainstalowane.Wejdź do folderu projektu
Przejdź do nowo utworzonego katalogu:
bashcd servbay-zend-app
1
Konfiguracja serwera WWW
Aby uzyskać dostęp do swojego projektu przez przeglądarkę, skonfiguruj stronę w ServBay.
- Otwórz panel ServBay: Uruchom aplikację ServBay.
- Przejdź do ustawień stron: W panelu wybierz zakładkę Websites (Strony).
- Dodaj nową stronę: Kliknij znak
+
w lewym dolnym rogu. - Wypełnij dane strony:
- Nazwa (Name): Nadaj stronie czytelną nazwę, np.
My Zend Dev Site
. - Domena (Domain): Podaj preferowaną domenę. Aby uniknąć konfliktów z rzeczywistymi domenami, zaleca się końcówki
.local
lub.test
, np.servbay-zend-test.local
. ServBay sam skonfiguruje lokalne DNS. - Typ strony (Website Type): Wybierz
PHP
. - Wersja PHP (PHP Version): Wybierz preferowaną wersję PHP (jak np.
8.3
). Upewnij się, że jest zainstalowana i aktywna w ServBay. - Katalog główny strony (Document Root): Wskaż katalog, który serwer www udostępni. W przypadku Zend Framework plik wejściowy
index.php
znajduje się w katalogupublic
projektu, więc ścieżka powinna wyglądać tak:/Applications/ServBay/www/servbay-zend-app/public
.
- Nazwa (Name): Nadaj stronie czytelną nazwę, np.
- Zapisz i zrestartuj: Kliknij Save (Zapisz). ServBay poprosi o potwierdzenie zmiany i przeładuje serwer www, aby nowe ustawienia weszły w życie.
Więcej szczegółów znajdziesz w dokumentacji ServBay, w rozdziale Dodawanie pierwszej strony.
Podstawowy przykład "Hello ServBay!"
Pokażemy, jak zmodyfikować kod tak, aby pod adresem głównym (/
) pojawił się napis "Hello ServBay!".
Konfiguracja routingu i kontrolera (module.config.php)
Edytuj plik
module/Application/config/module.config.php
i upewnij się, że zawiera podstawową konfigurację routingu i kontrolera:php<?php declare(strict_types=1); namespace Application; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; use Laminas\ServiceManager\Factory\InvokableFactory; return [ 'router' => [ 'routes' => [ 'home' => [ 'type' => Literal::class, 'options' => [ 'route' => '/', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'index', ], ], ], // ... inne konfiguracje routingu ], ], 'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, ], ], 'view_manager' => [ 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => [ 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.phtml', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ], 'template_path_stack' => [ __DIR__ . '/../view', ], ], // ... inne ustawienia ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49Uwaga: To fragment przykładowej konfiguracji
module.config.php
. Połącz go z istniejącym już kodem, by nie dublować opcji. Upewnij się, że istnieje trasa'home'
i definicja fabrykiController\IndexController::class
.Utworzenie lub edycja kontrolera (IndexController.php)
Edytuj lub stwórz plik
module/Application/src/Controller/IndexController.php
. MetodaindexAction
powinna zwracać ViewModel z przekazaną zmiennąmessage
:php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; class IndexController extends AbstractActionController { /** * Domyślna akcja — wyświetla stronę powitalną. */ public function indexAction() { // Zwraca ViewModel i przekazuje zmienną 'message' do widoku return new ViewModel([ 'message' => 'Hello ServBay!', ]); } // ... inne metody akcji }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Utworzenie lub edycja pliku widoku (index.phtml)
Edytuj lub stwórz plik
module/Application/view/application/index/index.phtml
. Kod powinien wyświetlać zmiennąmessage
:php<h1><?php echo $this->message; ?></h1>
1Do pobrania danych z kontrolera, korzystamy z
$this->message
, zgodnie z konwencją Zend Framework (Laminas).
Dostęp do strony
Otwórz przeglądarkę i wejdź na skonfigurowaną domenę, np. https://servbay-zend-test.local
.
Jeśli wszystko zostało poprawnie ustawione, zobaczysz stronę z napisem Hello ServBay!
. To oznacza, że Twój projekt Zend Framework działa w środowisku ServBay.
Przykłady integracji baz danych i cache
ServBay udostępnia wiele opcji baz danych i systemów cache. Poniżej przykłady użycia Memcached, Redis, MySQL i PostgreSQL w projekcie opartym na Zend Framework.
Ważne: Przykłady poniżej służą prezentacji. W prawdziwych projektach zwykle korzystasz z jednej bazy danych i jednego systemu cache — oraz zarządzasz zależnościami np. przez dependency injection. Upewnij się, że przed uruchomieniem testów odpowiednie usługi (np. MySQL, PostgreSQL, Memcached, Redis) są aktywne w ServBay.
Przykład interakcji z bazą danych — tworzenie tabeli
Na początek pokażemy, jak za pomocą komponentu Laminas DB utworzyć prostą tabelę w bazie. Przykład przedstawia ręczne wykonanie operacji CREATE TABLE, zamiast użycia narzędzi migracyjnych Laminas.
Instalacja komponentu Laminas DB
Przejdź do katalogu projektu i zainstaluj Laminas DB:
bashcomposer require laminas/laminas-db
1Ręczne utworzenie bazy danych
Przed uruchomieniem przykładowego kodu, utwórz bazę danych
servbay_zend_app
odpowiednią dla wybranego systemu (np. przez phpMyAdmin, pgAdmin czy MongoDB Compass). W ServBay domyślne dane logowania to: MySQL/MariaDB — użytkownikroot
, hasłopassword
; PostgreSQL — użytkownikroot
, hasłopassword
.Skrypt tworzący tabelę (przykład)
Utwórz plik PHP o nazwie
create_users_table.php
(w głównym katalogu projektu lub tymczasowo), a w nim:php<?php // create_users_table.php use Laminas\Db\Adapter\Adapter; use Laminas\Db\Sql\Sql; // Przykład dla MySQL albo MariaDB $adapter = new Adapter([ 'driver' => 'Pdo_Mysql', // lub 'Pdo_Pgsql' 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', // domyślne hasło ServBay 'hostname' => '127.0.0.1', // 'port' => 3306, // standardowy port MySQL // 'port' => 5432, // standardowy port PostgreSQL ]); $sql = new Sql($adapter); // Definicja SQL do utworzenia tabeli users $create = $sql->createTable('users') ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Integer('id', false, null, ['AUTO_INCREMENT' => true])) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('name', 255)) ->addColumn(new \Laminas\Db\Sql\Ddl\Column\Varchar('email', 255, ['UNIQUE' => true])) ->addConstraint(new \Laminas\Db\Sql\Ddl\Constraint\PrimaryKey('id')); echo "Wykonywanie SQL:\n"; echo $sql->buildSqlString($create, $adapter->getPlatform()) . "\n"; try { // Wykonanie SQL $adapter->query( $sql->buildSqlString($create, $adapter->getPlatform()), Adapter::QUERY_MODE_EXECUTE ); echo "Tabela 'users' została utworzona.\n"; } catch (\Exception $e) { echo "Błąd podczas tworzenia tabeli: " . $e->getMessage() . "\n"; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38Uwaga: Skrypt służy ręcznej prezentacji. W projektach produkcyjnych warto korzystać z narzędzi do migracji schematów, np. Laminas Migrations.
Aby wykonać skrypt w terminalu (będąc w katalogu projektu lub znając pełną ścieżkę):
bashphp create_users_table.php
1
Integracja z MySQL
Poniżej krok po kroku sposób połączenia i pobierania danych z bazy MySQL przez kontroler Zend Framework.
Konfiguracja ustawień bazy
Edytuj plik
config/autoload/global.php
i podaj dane dostępowe do MySQL. Jeśli plik zawiera sekcjędb
, zmodyfikuj ją; w przeciwnym razie — dodaj:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Mysql', 'database' => 'servbay_zend_app', // upewnij się, że baza istnieje 'username' => 'root', // domyślne dane ServBay 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 3306, 'charset' => 'utf8mb4', ], // ... inne ustawienia globalne ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14Konfiguracja fabryki kontrolera (module.config.php)
Żeby wstrzyknąć
Laminas\Db\Adapter\Adapter
w kontrolerze, należy zdefiniować fabrykę dlaIndexController
. Wmodule/Application/config/module.config.php
sekcjacontrollers
powinna wyglądać tak (jeśli masz już fabrykęInvokableFactory
, zastąp ją poniższą):php<?php // module/Application/config/module.config.php namespace Application; use Laminas\ServiceManager\Factory\InvokableFactory; // Zostaw, jeśli gdzie indziej wciąż używane use Laminas\Db\Adapter\AdapterInterface; return [ // ... inne ustawienia 'controllers' => [ 'factories' => [ Controller\IndexController::class => function($container) { $adapter = $container->get(AdapterInterface::class); return new Controller\IndexController($adapter); }, ], ], 'service_manager' => [ 'aliases' => [ AdapterInterface::class => 'Laminas\Db\Adapter\Adapter', ], 'factories' => [ 'Laminas\Db\Adapter\Adapter' => \Laminas\Db\Adapter\AdapterServiceFactory::class, ], ], // ... inne ustawienia ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27Uwaga: Wyżej to tylko fragment z
module.config.php
, połącz go z istniejącym kodem. Sprawdź, czy odpowiednie aliasy i fabryki znajdują się w sekcjiservice_manager
.Konfiguracja tras (module.config.php)
Dodaj do sekcji
'routes'
wmodule/Application/config/module.config.php
nowe trasy dla przykładów MySQL:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; // ... inne użycia return [ 'router' => [ 'routes' => [ // ... istniejące trasy (np. 'home') 'mysql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysqlAdd', ], ], ], 'mysql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/mysql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'mysql', ], ], ], ], ], // ... inne ustawienia ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35Dodanie akcji do kontrolera (IndexController.php)
W pliku
module/Application/src/Controller/IndexController.php
dodaj poniższy konstruktor oraz akcje:php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; // Konstruktor z adapterem public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } /** * Domyślna akcja. */ public function indexAction() { return new ViewModel([ 'message' => 'Hello ServBay!', ]); } /** * Akcja dodająca użytkownika do tabeli 'users' (MySQL). */ public function mysqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'MySQL User added successfully.' : 'Failed to add MySQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * Akcja pobierająca wszystkich użytkowników z tabeli 'users' (MySQL). */ public function mysqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } // ... inne metody akcji }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76Pliki widoków
Utwórz plik
module/Application/view/application/index/mysql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1Utwórz plik
module/Application/view/application/index/mysql.phtml
:php<h1>MySQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2Testowanie integracji MySQL
Upewnij się, że MySQL w ServBay jest aktywny. Najpierw przejdź do adresu
https://servbay-zend-test.local/mysql-add
, by dodać użytkownika — powinieneś zobaczyć komunikat o sukcesie. Potem wejdź nahttps://servbay-zend-test.local/mysql
, aby wyświetlić dane użytkowników w formacie JSON.
Integracja z PostgreSQL
Sposób działania analogiczny do MySQL.
Konfiguracja ustawień bazy
W pliku
config/autoload/global.php
podmień konfigurację na:php<?php // config/autoload/global.php return [ 'db' => [ 'driver' => 'Pdo_Pgsql', 'database' => 'servbay_zend_app', 'username' => 'root', 'password' => 'password', 'hostname' => '127.0.0.1', 'port' => 5432, ], // ... inne ustawienia ];
1
2
3
4
5
6
7
8
9
10
11
12
13Konfiguracja fabryki kontrolera (module.config.php)
(Jak w przykładzie MySQL) — jeśli już ustawiłeś fabrykę dla PostgreSQL, nie trzeba nic zmieniać.
Dodanie tras (module.config.php)
Dodaj do sekcji
'routes'
w pliku:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ // ... inne trasy 'pgsql-add' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql-add', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsqlAdd', ], ], ], 'pgsql' => [ 'type' => Literal::class, 'options' => [ 'route' => '/pgsql', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'pgsql', ], ], ], ], ], // ... inne ustawienia ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34Dodanie akcji do kontrolera (IndexController.php)
Dodaj poniżej kolejne dwie akcje:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Db\Adapter\AdapterInterface; use Laminas\Db\Sql\Sql; class IndexController extends AbstractActionController { private $adapter; public function __construct(AdapterInterface $adapter) { $this->adapter = $adapter; } // ... inne akcje /** * Dodaje użytkownika do tabeli 'users' (PostgreSQL). */ public function pgsqlAddAction() { $sql = new Sql($this->adapter); $insert = $sql->insert('users') ->values([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', ]); $statement = $sql->prepareStatementForSqlObject($insert); $result = $statement->execute(); $message = $result->getAffectedRows() > 0 ? 'PostgreSQL User added successfully.' : 'Failed to add PostgreSQL user.'; return new ViewModel([ 'message' => $message, ]); } /** * Pobiera wszystkich użytkowników z tabeli 'users' (PostgreSQL). */ public function pgsqlAction() { $sql = new Sql($this->adapter); $select = $sql->select('users'); $statement = $sql->prepareStatementForSqlObject($select); $result = $statement->execute(); $users = []; foreach ($result as $row) { $users[] = $row; } return new ViewModel([ 'users' => json_encode($users, JSON_PRETTY_PRINT), ]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65Pliki widoków
Utwórz
module/Application/view/application/index/pgsql-add.phtml
:php<h1><?php echo $this->message; ?></h1>
1Utwórz
module/Application/view/application/index/pgsql.phtml
:php<h1>PostgreSQL Users</h1> <pre><?php echo $this->users; ?></pre>
1
2Testowanie integracji PostgreSQL
Upewnij się, że w ServBay działa usługa PostgreSQL. Skorzystaj z adresów
https://servbay-zend-test.local/pgsql-add
— aby dodać użytkownika, orazhttps://servbay-zend-test.local/pgsql
— aby sprawdzić, czy się dodał.
Integracja z Memcached
Przykład użycia Memcached w kontrolerze Zend Framework.
Instalacja adaptera Memcached
W pliku
composer.json
projektu dopisz:json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-memcached": "^2.0" // ... inne zależności } // ... inne ustawienia }
1
2
3
4
5
6
7
8
9Następnie w terminalu uruchom:
bashcomposer update
1ServBay domyślnie zawiera rozszerzenie PHP
memcached
.Dodanie trasy (module.config.php)
W sekcji
'routes'
wmodule/Application/config/module.config.php
dodaj:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ // ... inne trasy 'memcached' => [ 'type' => Literal::class, 'options' => [ 'route' => '/memcached', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'memcached', ], ], ], ], ], // ... inne ustawienia ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Dodanie akcji do kontrolera (IndexController.php)
Dodaj metodę:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... konstruktor i inne akcje /** * Pokazuje przykład użycia Memcached. */ public function memcachedAction() { // Domyślnie Memcached na 127.0.0.1:11211 $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'memcached', 'options' => [ 'servers' => [ ['127.0.0.1', 11211], ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_memcached_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Memcached! (Data from source, cached at ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53Widok
Utwórz plik
module/Application/view/application/index/memcached.phtml
:php<h1>Przykład Memcached</h1> <p><?php echo $this->message; ?></p>
1
2Testowanie Memcached
Upewnij się, że w ServBay jest uruchomiony Memcached. Odwiedź
https://servbay-zend-test.local/memcached
. Za pierwszym razem pojawi się informacja "CACHE MISS" i aktualny czas; przy kolejnych wejściach (w ramach okresu ważności) zobaczysz "CACHE HIT" i ten sam czas (dane pobrane z cache).
Integracja z Redis
Przykład integracji Redis jako systemu cache lub prostej bazy klucz-wartość.
Instalacja adaptera Redis
Dodaj do
composer.json
:json// composer.json { "require": { "laminas/laminas-skeleton-application": "^1.0", "laminas/laminas-cache-storage-adapter-redis": "^2.0", "ext-redis": "*" // ... inne zależności } // ... inne ustawienia }
1
2
3
4
5
6
7
8
9
10Następnie uruchom w terminalu:
bashcomposer update
1ServBay zawiera już rozszerzenie PHP
redis
.Dodanie trasy (module.config.php)
W sekcji
'routes'
w pliku dodaj:php<?php // module/Application/config/module.config.php namespace Application; use Laminas\Router\Http\Literal; return [ 'router' => [ 'routes' => [ // ... inne trasy 'redis' => [ 'type' => Literal::class, 'options' => [ 'route' => '/redis', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'redis', ], ], ], ], ], // ... inne ustawienia ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Dodanie akcji do kontrolera (IndexController.php)
Dodaj metodę:
php<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; use Laminas\Cache\StorageFactory; use Laminas\Cache\Storage\StorageInterface; class IndexController extends AbstractActionController { // ... konstruktor i inne metody /** * Pokazuje przykład użycia Redis. */ public function redisAction() { // Domyślnie Redis działa na 127.0.0.1:6379 $cache = StorageFactory::factory([ 'adapter' => [ 'name' => 'redis', 'options' => [ 'server' => [ 'host' => '127.0.0.1', 'port' => 6379, ], 'ttl' => 300, ], ], 'plugins' => [ 'serializer', 'exception_handler' => ['throw_exceptions' => false], ], ]); $cacheKey = 'my_redis_data'; $cachedData = $cache->getItem($cacheKey, $success); if (!$success) { $cachedData = 'Hello Redis! (Data from source, cached at ' . date('Y-m-d H:i:s') . ')'; $cache->setItem($cacheKey, $cachedData); $cachedData .= ' - CACHE MISS'; } else { $cachedData .= ' - CACHE HIT'; } return new ViewModel([ 'message' => $cachedData, ]); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54Widok
Utwórz plik
module/Application/view/application/index/redis.phtml
:php<h1>Przykład Redis</h1> <p><?php echo $this->message; ?></p>
1
2Testowanie Redis
Upewnij się, że Redis działa w ServBay. Wejdź na
https://servbay-zend-test.local/redis
— przy pierwszym wejściu pojawia się "CACHE MISS"; przy kolejnych (w ramach TTL) — "CACHE HIT" (dane wracają z cache).
Podsumowanie
Dzięki powyższym instrukcjom stworzyłeś, skonfigurowałeś i uruchomiłeś projekt Zend Framework (Laminas) w lokalnym środowisku ServBay. Wiesz teraz, jak skonfigurować stronę w ServBay i wskazać katalog publiczny projektu, a także jak dodać i używać integracji z bazami danych MySQL, PostgreSQL oraz systemami cache Memcached i Redis.
ServBay znacząco upraszcza budowę i zarządzanie środowiskiem developerskim, pozwalając Ci skupić się na kodzie i rozwoju projektu. Dzięki szerokiemu wyborowi komponentów i elastycznej konfiguracji, możesz łatwo odwzorować środowisko produkcyjne lokalnie i pracować szybciej oraz bardziej efektywnie.