Zend Framework - Manajer Layanan
Zend Framework menyertakan implementasi pola pencari lokasi layanan yang disebut zend-servicemanager. Zend framework secara ekstensif menggunakan manajer layanan untuk semua fungsinya. Manajer Layanan menyediakan abstraksi tingkat tinggi untuk Zend Framework. Ini juga terintegrasi dengan baik dengan semua komponen lain dari Zend Framework.
Instal Manajer Layanan
Komponen Service Manager dapat diinstal menggunakan composer alat.
composer require zendframework/zend-servicemanager
Contoh
Pertama, semua layanan harus didaftarkan ke manajer layanan. Setelah layanan didaftarkan ke sistem manajer server, layanan dapat diakses kapan saja dengan sedikit usaha. Manajer layanan menyediakan banyak opsi untuk mendaftarkan layanan. Contoh sederhananya adalah sebagai berikut -
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Factory\InvokableFactory;
use stdClass;
$serviceManager = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class,],
]);
Kode di atas mendaftarkan stdClass ke dalam sistem menggunakan Factorypilihan. Sekarang, kita bisa mendapatkan instance stdClass kapan saja menggunakanget() metode manajer layanan seperti yang ditunjukkan di bawah ini.
use Zend\ServiceManager\ServiceManager;
$object = $serviceManager->get(stdClass::class);
Metode get () membagikan objek yang diambil dan karenanya, objek yang dikembalikan dengan memanggil metode get () beberapa kali adalah satu instance yang sama. Untuk mendapatkan contoh yang berbeda setiap saat, manajer layanan menyediakan metode lain, yaitubuild() metode.
use Zend\ServiceManager\ServiceManager;
$a = $serviceManager->build(stdClass::class); $b = $serviceManager->build(stdClass::class);
Pendaftaran Manajer Layanan
Manajer layanan menyediakan sekumpulan metode untuk mendaftarkan sebuah komponen. Beberapa metode terpenting adalah seperti yang diberikan di bawah ini -
- Metode pabrik
- Metode pabrik abstrak
- Metode penginisialisasi
- Metode pabrik pendelegator
Kami akan membahas masing-masing secara rinci di bab-bab selanjutnya.
Metode Pabrik
Pabrik pada dasarnya adalah setiap kelas yang dapat dipanggil atau kelas apa pun yang mengimplementasikan FactoryInterface (Zend \ ServiceManager \ Factory \ FactoryInterface).
FactoryInterface memiliki satu metode -
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
Detail argumen dari FactoryInterface adalah sebagai berikut -
container (ContainerInterface)- Ini adalah antarmuka dasar dari ServiceManager. Ini memberikan opsi untuk mendapatkan layanan lain.
requestedName - Ini adalah nama layanan.
options - Ini memberikan opsi tambahan yang dibutuhkan untuk layanan.
Mari kita buat kelas sederhana yang mengimplementasikan FactoryInterface dan melihat cara mendaftarkan kelas tersebut.
Tes Kelas - Objek yang akan Diperoleh
use stdClass;
class Test {
public function __construct(stdClass $sc) { // use $sc
}
}
Itu Test kelas tergantung pada stdClass tersebut.
Kelas TestFactory - Kelas untuk Menginisialisasi Objek Uji
class TestFactory implements FactoryInterface {
public function __invoke(ContainerInterface $container, $requestedName,
array $options = null) { $dep = $container->get(stdClass::class); return new Test($dep);
}
}
TestFactory menggunakan container untuk mengambil stdClass, membuat instance kelas Test, dan mengembalikannya.
Pendaftaran dan Penggunaan Zend Framework
Sekarang mari kita mengerti cara mendaftar dan menggunakan Zend Framework.
serviceManager $sc = new ServiceManager([ 'factories' => [stdClass::class => InvokableFactory::class, Test::class => TestFactory::class] ]); $test = $sc->get(Test::class);
Manajer layanan menyediakan pabrik khusus yang disebut InvokableFactoryuntuk mengambil kelas apa pun yang tidak memiliki ketergantungan. Misalnya, filestdClass dapat dikonfigurasi menggunakan InvokableFactory karena stdClass tidak bergantung pada kelas lain.
serviceManager $sc = new ServiceManager([
'factories' => [stdClass::class => InvokableFactory::class]
]);
$stdC = $sc->get(stdClass::class);
Cara lain untuk mengambil objek tanpa mengimplementasikan FactoryInterface atau menggunakan InvokableFactory menggunakan metode sebaris seperti yang diberikan di bawah ini.
$serviceManager = new ServiceManager([ 'factories' => [ stdClass::class => InvokableFactory::class, Test::class => function(ContainerInterface $container, $requestedName) { $dep = $container->get(stdClass::class); return new Test($dep);
},
],
]);
Metode Pabrik Abstrak
Terkadang, kita mungkin perlu membuat objek, yang baru kita ketahui saat runtime. Situasi ini dapat ditangani dengan menggunakanAbstractFactoryInterface, yang diturunkan dari FactoryInterface.
AbstractFactoryInterface mendefinisikan metode untuk memeriksa apakah objek dapat dibuat pada instance yang diminta atau tidak. Jika pembuatan objek dimungkinkan, itu akan membuat objek menggunakan__invokemethod dari FactoryInterface dan mengembalikannya.
Tanda tangan dari AbstractFactoryInterface adalah sebagai berikut -
public function canCreate(ContainerInterface $container, $requestedName)
Metode Penginisialisasi
Metode Penginisialisasi adalah opsi khusus untuk memasukkan ketergantungan tambahan untuk layanan yang sudah dibuat. Ini mengimplementasikanInitializerInterface dan tanda tangan dari satu-satunya metode yang tersedia adalah sebagai berikut -
public function(ContainerInterface $container, $instance)
function(ContainerInterface $container, $instance) {
if (! $instance instanceof EventManagerAwareInterface) { return; } $instance->setEventManager($container->get(EventManager::class));
}
Dalam contoh di atas, metode memeriksa apakah instance berjenis EventManagerAwareInterface. Jika itu tipeEventManagerAwareInterface, ini menyetel objek pengelola acara, jika tidak, tidak. Karena, metode ini mungkin atau mungkin tidak menyetel ketergantungan, metode ini tidak dapat diandalkan dan menghasilkan banyak masalah waktu proses.
Metode Pabrik Delegator
Zend Framework mendukung pola delegator melalui DelegatorFactoryInterface. Ini dapat digunakan untuk mendekorasi layanan.
Tanda tangan dari fungsi ini adalah sebagai berikut -
public function __invoke(ContainerInterface $container,
$name, callable $callback, array $options = null
);
Di sini $callback bertanggung jawab untuk mendekorasi instance layanan.
Layanan Malas
Layanan malas adalah salah satu layanan yang tidak akan diinisialisasi sepenuhnya pada saat pembuatan. Mereka hanya direferensikan dan hanya diinisialisasi ketika benar-benar dibutuhkan. Salah satu contoh terbaik adalah koneksi database, yang mungkin tidak diperlukan di semua tempat. Ini adalah sumber daya yang mahal serta memiliki proses yang memakan waktu untuk membuatnya. Zend framework menyediakanLazyServiceFactory berasal dari DelegatorFactoryInterface, yang dapat menghasilkan layanan malas dengan bantuan Delegator konsep dan pengelola proxy pihak ketiga, yang disebut sebagai ocramius proxy manager.
Manajer Plugin
Plugin Manager memperluas manajer layanan dan menyediakan fungsionalitas tambahan seperti validasi instance. Zend Framework secara ekstensif menggunakan pengelola plugin.
Misalnya, semua layanan validasi berada di bawah ValidationPluginManager.
Opsi Konfigurasi
Manajer layanan menyediakan beberapa opsi untuk memperluas fitur manajer layanan. Merekashared, shared_by_default dan aliases. Seperti yang kita bahas sebelumnya, objek yang diambil dibagikan di antara objek yang diminta secara default dan kita bisa menggunakanbuild()metode untuk mendapatkan objek yang berbeda. Kita juga bisa menggunakansharedopsi untuk menentukan layanan mana yang akan dibagikan. Itushared_by_default sama dengan shared fitur, kecuali itu berlaku untuk semua layanan.
$serviceManager = new ServiceManager([
'factories' => [
stdClass::class => InvokableFactory::class
],
'shared' => [
stdClass::class => false // will not be shared
],
'shared_by_default' => false, // will not be shared and applies to all service
]);
Itu aliasesopsi dapat digunakan untuk memberikan nama alternatif untuk layanan terdaftar. Ini memiliki kelebihan dan kekurangan. Sisi positifnya, kami dapat memberikan nama pendek alternatif untuk layanan. Namun, pada saat yang sama, namanya mungkin keluar dari konteks dan menimbulkan bug.
aliases' => ['std' => stdClass::class, 'standard' => 'std']