vivait/settings-bundle

该软件包已被弃用且不再维护。未建议替代软件包。

设置包

0.4 2017-08-09 10:55 UTC

This package is auto-updated.

Last update: 2021-06-14 12:53:56 UTC


README

该包的目的是允许您检索并将动态设置传递给在Symfony中使用的服务和其它类。这些设置目前可以存储在Doctrine、Redis或Symfony的配置中。可以为每个设置和服务指定单个或多个驱动程序,它将搜索每个驱动程序,直到找到设置。

提供了一个控制器,可以轻松地让您的用户通过UI配置设置——尽管我们建议您根据自己的应用程序进行自定义。

安装

使用Composer

$ composer require vivait/settings-bundle

启用包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Vivait\SettingsBundle\VivaitSettingsBundle()
    );
}

添加路由规则(可选)

# app/config/routing.yml
vivait_settings:
  resource: "@VivaitSettingsBundle/Resources/config/routing.yml"
  prefix:   /settings

使用方法

通过驱动程序访问设置。该包附带了一些驱动程序以供您开始,但您必须在您的config.yml文件中定义它们。

vivait_settings:
    drivers:
        yaml: vivait_settings.driver.yaml
        doctrine: vivait_settings.driver.doctrine

检索设置的最简单方法是通过直接使用vivait_settings.registry类。这将检查所有可用的驱动程序,直到找到设置。

  $this->get('vivait_settings.registry')->get('settingname');

您还可以通过驱动程序集合检查设置。驱动程序集合只是一个驱动程序的堆栈,可以通过vivait_settings.registry类创建。

  $this->get('vivait_settings.registry')->drivers(['doctrine', 'yaml'])->get('settingname');

在上面的示例中,设置注册表将尝试驱动程序集合中引用的每个驱动程序,直到找到适当的设置。

您还可以为在任一驱动程序中找不到设置值的情况指定一个默认值。

  $this->get('vivait_settings.registry')->get('settingname', 'default value');

### 直接将设置传递给服务 最可能的情况是,您希望将设置直接传递到您服务配置文件中的服务。您可以通过表达式完成此操作。

services:
    my_service:
        class:        "Me\MyBundle\Services\MyService"
        arguments:    [ "@=service('vivait_settings.registry').get('myservice.settingname')" ]

您仍然可以在表达式中指定驱动程序。

services:
    my_service:
        class:        "Me\MyBundle\Services\MyService"
        arguments:    [ "@=service('vivait_settings.registry').drivers(['yaml', 'doctrine']).get('myservice.settingname')" ]

在上面的示例中,我们如何使用“.”对设置进行分类。原因将在我们创建设置表单时变得明显,但组是可选的,并且可以嵌套。

添加自定义驱动程序

添加自定义驱动程序非常简单,并且被鼓励。例如,作为我们Auth Bundle的一部分,我们允许每个用户的设置。这是通过自定义驱动程序提供的。

所有驱动程序都必须实现\Vivait\SettingsBundle\Driver\ParametersStorageInterface接口。要注册驱动程序,请将其添加到服务容器中。

  me.mybundle.mydriver:
    class: Me\MyBundle\Driver\MyDriver

接下来,将服务ID添加到您的config.yml文件中,如上所述。

使用表单更改设置

创建一个表单类型,并注入所需的驱动程序。

  me.mybundle.form.type.settings_signtaure:
    class: Me\MyBundle\Form\Type\SignatureType
    arguments: [@vivait_settings.driver.doctrine]
    tags:
      - { name: form.type, alias: 'signature' }

在表单类型中,添加您希望修改的设置键,以及SettingsSubscriberKeyToArrayTransformer

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'signature', //setting key
            'textarea'
        )
    ->add('Submit', 'submit');

    $builder->addEventSubscriber(new SettingsSubscriber($this->driver));
    $builder->addModelTransformer(new KeyToArrayTransformer());
}

像平常一样处理表单,但使用您选择的驱动程序设置数据

public function signatureAction(Request $request)
{
    $form = $this->createForm('signature');
    $form->handleRequest($request);

    if($form->isValid()){
        $driver = $this->get('vivait_settings.driver.doctrine');
        foreach($form->getData() as $key => $value){
            $driver->set($key, $value);
    }
}

测试运行

单元测试是用PHPSpec编写的。