Nano Hash - криптовалюты, майнинг, программирование

Как я могу получить доступ к адаптеру базы данных в наборе полей ZF2?

Я последовал примеру и хотел бы передать адаптер базы данных в набор полей, чтобы создать раскрывающееся меню.

В приведенном ниже коде я вызываю набор полей.
Как я могу получить доступ к адаптеру базы данных в классе BrandFieldset?

$this->add(array(
    'type' => 'Application\Form\BrandFieldset',
    'name' => 'brand',
    'options' => array(
        'label' => 'Brand of the product',
    ),
));

Ответы:


1

За создание экземпляра набора полей отвечает FormElementManager. . Когда вы пытаетесь получить доступ к форме, элементу формы или набору полей, FormElementManager знает, где их найти и как их создать. Это поведение описано в разделе службы по умолчанию в структуре. .

Поскольку правильный способ доступа к элементам формы — это извлечение их из FormElementManager, я бы написал BrandFieldsetFactory для внедрения этого адаптера БД или дополнительных зависимостей в набор полей при построении для достижения этой цели.

Фабрика, дружественная к ZF3, будет выглядеть так:

<?php
namespace Application\Form\Factory;

use Application\Form\BrandFieldset;
use Interop\Container\ContainerInterface;

class BrandFieldsetFactory
{
    /**
     * @return BrandFieldset
     */
    public function __invoke(ContainerInterface $fem, $name, array $options = null)
    {
        // FormElementManager is child of AbstractPluginManager 
        // which makes it a ContainerInterface instance
        $adapter = $fem->getServiceLocator()->get('Your\Db\Adapter');
        return new BrandFieldset($adapter);
    }
}

На этом этапе BrandFieldset должен расширять Zend\Form\Fieldset\Fieldset, и его конструктор может выглядеть следующим образом:

private $dbAdapter;

/**
 * {@inheritdoc}
 */
public function __construct(My/Db/Adapter $db, $options = [])
{
    $this->dbAdapter = $db;
    return parent::__construct('brand-fieldset', $options);
}

Наконец, в файле module.config.php у меня будет конфигурация, чтобы сообщить FormElementManager об этой фабрике:

<?php

use Application\Form\BrandFieldset;
use Application\Form\Factory\BrandFieldsetFactory;

return [
    // other config

    // Configuration for form element manager
    'form_elements' => [
        'factories' => [
            BrandFieldset::class => BrandFieldsetFactory::class
        ],
    ],
];

СОВЕТ. Метод BrandFieldset::init() будет автоматически вызываться FormElementManager после построения. В этот метод можно поместить любую логику пост-инициализации.

04.02.2017
  • Можно ли это использовать в ZF2? У меня проблемы с тем, чтобы заставить его работать. 01.05.2017
  • Конечно, после того, как заводской ZF2 станет дружелюбным, он должен работать. Просто добавьте метод createService() в фабрику, как и другие фабрики zf2, и вызовите _invoke из этого метода. 01.05.2017
  • Я не уверен, что ты имеешь в виду. Если я var выгружаю $db в наборе полей, я получаю имя класса (brandfieldset). Не похоже, чтобы фабрика когда-либо вызывалась (если я выхожу или выгружаю var на фабрике, ничего не происходит) 02.05.2017
  • На Фабрику, кажется, никогда не звонят. публичная функция __invoke(ContainerInterface $fem, $name, array $options = null) { echo 'это работает'; выход; // FormElementManager является дочерним по отношению к AbstractPluginManager, // что делает его экземпляром ContainerInterface $adapter = $fem->getServiceLocator()->get('Your\Db\Adapter'); вернуть новый BrandFieldset ($ адаптер); } 02.05.2017

  • 2

    Основываясь на этих документах, я смог найти решение.

    https://framework.zend.com/manual/2.1/en/modules/zend.form.advanced-use-of-forms.html

    'form_elements' => array(
        'invokables' => array(
            'fieldset' => BrandFieldsetFactory::class
        )
    )
    

    Мне нужно было вызвать форму, используя локатор службы в контроллере, как показано ниже.

    $sl = $this->getServiceLocator();
    $form = $sl->get('FormElementManager')->get('Application\Form\CreateForm');
    

    Кроме того, я изменил __construct на init.

    02.05.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..