Witajcie, potrzebowałbym pomocy kogoś, kto dobrze zna wzorce projektowe (głównie Dependency Injection) oraz framework Laminas (wcześniej Zend Framework)
Laminas zawiera ciekawy komponent o nazwie Service Manager. Oparty jest on o wzorzec projektowy dependency-injection ( w sumie też w dużej części o wzorzec factory )
Do rzeczy: jak wiemy, w Zendzie cała aplikacja dzieli się na moduły (zapisywane w ścieżce /modules). Każdy taki moduł posiada plik Module.php, do którego można zaimportować lub bezpośrednio w nim zapisać konfigurację tego modułu. Jedną z możliwych do konfiguracji rzeczy są właśnie serwisy, które są obsługiwane przez Service Manager.
Problem polega na tym, że serwisy przekazane w tej konfiguracji nie są widoczne w pozostałych komponentach modułu, więc na przykład przykładowy plik Module.php :
<?php
namespace App;
class Module
{
public function getConfig()
{
return include '../config/module.config.php';
}
public function getServiceConfig()
{
return [
'factories' => [
'AppTableGateway' => function(ServiceManager $sm) {
$tableName = 'app';
$dbAdapter = new \Laminas\Db\Adapter\Adapter([
'driver' => 'Pdo',
'database' => 'app',
'username' => 'root',
'password' => '123456',
'hostname' => 'localhost',
]);
return new TableGateway($tableName, $dbAdapter);
}
]
];
}
}
Skonfigurowałem sobie tutaj serwis 'AppTableGateway'. Nie mogę jednak dostać się do tego serwisu w innym miejscu modułu (np. App\Utilities\Database) za pomocą:
<?php
namespace App\Utilities\Database;
class Database
{
public function __construct()
{
$serviceManager = new ServiceManager();
$appTableGateway = $serviceManager->get('AppTableGateway'); // nie pobiera
// Dalszy ciąg klasy / kodu
}
}
Z tego co czytałem Service Manager to komponent, który powinien przechowywać rejestr serwisów i w każdej chwili można się do tego rejestru dostać - po czym wyciągnąć co się wcześniej skonfigurowało.
Czy jest jakiś sposób na obsługę ServiceManager'a, który pozwoli na trwałość zapisanych serwisów podczas konfiguracji?