ist zur Klärung
In ZF3, wenn Sie Klassen erstellen, die in Ihrer Anwendung benötigt, sie gewartet machen, so dass sie in Ihrer Anwendung über Servicemanager zur Verfügung stellen. ServiceManager implementiert einen Container, der registrierte Dienste speichert. Also, wie ist das? ZF verwendet eine Methode namens Factory (kurz, es erstellt Objekt). Es hilft Dienste in Container zu speichern. Wir können dann Dienste aus diesem Container mit ServiceManager abrufen. Mal sehen wie?
ServiceManager ist selbst ein Service.
eine Fabrik Also mit der Servicemanager Instanz in einem Controller machen lassen (zum Beispiel Indexcontroller). Damit wir Service nutzen können.
Application \ Controllers \ IndexControllerFactory
<?php
namespace Application\Controller;
// This is the container
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
class IndexControllerFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = NULL)
{
$serviceManager = $container->get('ServiceManager');
return new IndexController($serviceManager);
}
}
Sagen wir es so konfigurieren, dass wir es verwenden können. Nehmen Sie die folgende Änderung in der moudle.config.php
'controllers' => [
'factories' => [
Controller\IndexController::class => Controller\IndexControllerFactory::class,
],
],
Sobald die Indexcontroller instanziiert von IndexControllerFactory (von oben Konfigurationen) die Servicemanager Instanz durch Indexcontroller Konstruktor verfügbar wird.
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\ServiceManager\ServiceManager;
class IndexController extends AbstractActionController
{
protected $serviceManager;
public function __construct(ServiceManager $serviceManager)
{
// Here we set the service manager instance
$this->serviceManager = $serviceManager;
}
public function indexAction()
{
// Use this as you want
$config = $this->serviceManager->get('config');
return new ViewModel();
}
Was passiert, wenn wir etwas von Config Dienst innerhalb einer anderen Klasse anstelle des Controller? Zum Beispiel möchten wir Bilder in ein bestimmtes Ziel hochladen. Wie würden wir den Upload-Pfad beheben? Siehe das folgende Beispiel.
Wir werden Bilder hochladen durch RenameUpload Filter. Es hat eine Option mit dem Namen Ziel, die das Ziel des Upload-Pfades angibt. Lassen Sie uns ein weiteres Werk für den Upload-Filter erstellen.
Application \ Controllers \ Formular \ Filter \ UploadFilterFactory
<?php
namespace Application\Form\Filter;
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\Factory\FactoryInterface;
use Application\Form\Filter\UploadFilter;
class UploadFilterFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = NULL)
{
$config = $container->get('config');
// Look! here we fix the upload path
$uploadPath = $config['module_config']['upload_path'];
// Here we're injecting that path
return new UploadFilter($uploadPath);
}
}
Machen Sie dasselbe für die UploadForm wenn Sie benötigen. Dies wird UploadFormFactory
Setzen Sie die folgenden zwei Schnipsel in der module.config.php. Dies ist für UploadFilterFactory.
'service_manager' => [
'factories' => [
// UploadForm::class => UploadFormFactory::class,
UploadFilter::class => UploadFilterFactory::class,
],
// Make an alias so that we can use it where we need
// it could be uploadAction() inside any controller
// $inputForm = $this->serviceManager->get('UploadForm');
// $inputFilter = $this->serviceManager->get('UploadFilter');
// $uploadForm->setInputFilter($inputFilter), for example
'aliases' => [
// 'UploadForm' => UploadForm::class,
'UploadFilter' => UploadFilter::class,
],
],
und dieses für den Upload-Pfad wo immer Sie hochladen möchten.
'module_config' => [
// Set the path as you want
'upload_path' => __DIR__ . '/../data/upload',
],
Dies ist die Application \ Formular \ Filter \ UploadFilter.
<?php
namespace Application\Form\Filter;
use Zend\InputFilter\InputFilter;
use Zend\Filter\File\RenameUpload;
class UploadFilter extends InputFilter
{
protected $uploadPath;
public function __construct(string $uploadPath)
{
// We're assigning here so that we can use it
// on the filter section.
$this->uploadPath = $uploadPath;
$this->prepareFilters();
}
public function prepareFilters()
{
$this->add(array(
'name' => 'image',
'required' => true,
'filters' => array(
array(
'name' => RenameUpload::class,
'options' => array(
// Thus here we use it
'target' => $this->uploadPath,
'overwrite' => true,
'randomize' => true,
'use_upload_extension' => true,
),
),
),
'validators' => array(),
));
}
}
Dies ist eine Möglichkeit, Dinge wartungsfähig zu machen. Warum ist ServiceManager? Dies dient dazu, verstreute Anwendungen von Objekten zu stoppen. Es entfernt versteckte Abhängigkeiten. Dies macht den Code sauber und einfacher zu verstehen. Das Prinzip ist Gutes Design.
Hallo, ich habe folgendes, aber es gibt einen Fehler: – sparkmix