如何“修改”闭包

梅尔文·考普曼斯(Melvin Koopmans)

我正在制作一个类,以向Metapress.io的扩展功能的Wordpress添加元框。

现在,您通常会拥有具有相同属性的元框(例如,相同的帖子类型)。我想对它们进行分组,因此您不必重复这些属性。

我有一个add()仅添加一个metabox的函数

现在,我希望该group()方法执行以下操作:

$manager->group([
    'post_types' =>'page',
], function() use ($manager) {

    $manager->add('metaboxfromgroup', [
        'title'      => __( 'Metabox added from group!', 'textdomain' ),
        'context'    => 'normal',
        'fields'     => [
            [
                'name'  => __( 'Here is a field', 'textdomain' ),
                'id'    => 'fname',
                'type'  => 'text',
            ],
        ]
    ]);

});

因此,我的group()方法接受一个属性数组,该属性数组需要添加到add()Closure中每个单个属性的数组中

Laravel使用Routes确实做到了这一点,看起来像这样:

Route::group(['middleware' => 'auth'], function () {
    Route::get('/', function ()    {
        // Uses Auth Middleware
    });

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
}); 

实现此目标的最佳方法是什么?

编辑:

这是我的Metabox管理器课程

namespace Vendor\Lib;

use Vendor\App\Config as Config;

final class Metabox {

    /** @var string */
    protected $prefix;

    /** @var array */
    static private $metaboxes = [];

    public static function getInstance()
    {
        static $inst = null;
        if ($inst === null) {
            $inst = new Metabox();
        }
        return $inst;
    }

    /**
     * Metabox constructor.
     *
     * @param string $prefix
     */
    private function __construct() {
        $this->prefix = Config::get('metabox.prefix');
    }

    /**
     * Add a new metabox.
     *
     * @param string $id
     * @param array $attributes
     */
    public function add( $id, array $attributes ) {
        $attributes['id'] = $id;

        array_walk_recursive( $attributes, function ( &$value, $key ) {
            if (
                $key === 'id'
                && substr( $value, 0, strlen( $this->prefix ) ) !== $this->prefix
            ) {
                $value = $this->prefix . $value; // auto prefix
            }
        } );

        self::$metaboxes[] = $attributes;
    }

    public function group( $attributes, $function) {
        // here comes group method
    }

    /**
     * Register the metaboxes.
     */
    public function register() {
        add_filter( 'rwmb_meta_boxes', function () {
            return self::$metaboxes;
        } );
    }

}
马可·奥雷利奥·德勒(MarcoAurélioDeleu)

这是一个建议。调用该group方法时,您可以将可共享信息存储在您的类中,以后再在您的add方法中使用它

final class Metabox {
    private $group = [];
    ...
}

public function group( $attributes, $function) {
    $this->group = $attributes;
    $function(); // Invoke the closure, I don't remember if this is the right way.
    $this->group = [];  // Clean up the group.
}

现在,对于add方法。

/**
 * Add a new metabox.
 *
 * @param string $id
 * @param array $attributes
 */
public function add( $id, array $attributes ) {
    if(!empty($this->group))
       $attributes = array_merge($group, $attributes);

    $attributes['id'] = $id;

    array_walk_recursive( $attributes, function ( &$value, $key ) {
        if (
            $key === 'id'
            && substr( $value, 0, strlen( $this->prefix ) ) !== $this->prefix
        ) {
            $value = $this->prefix . $value; // auto prefix
        }
    } );

    self::$metaboxes[] = $attributes;
}

旁注:通过将array_merge$attributes用作第二个参数,您可以覆盖仅用于特定添加的组值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从闭包修改闭包外的值?

来自分类Dev

如何从闭包内部修改在闭包外部定义的变量?

来自分类Dev

如何从嵌套闭包中修改局部变量?

来自分类Dev

修改PHP中的闭包

来自分类Dev

如何同步闭包?

来自分类Dev

修改后的闭包和setTimeout

来自分类Dev

访问修改后的闭包:ReSharper

来自分类Dev

如何升级到C#5.0?访问修改后的闭包

来自分类Dev

如何在从成员函数调用的闭包中修改self?

来自分类Dev

如何存储多态闭包?

来自分类Dev

如何存储通用闭包?

来自分类Dev

JavaScript闭包。JS引擎如何选择闭包变量?

来自分类Dev

如何从闭包返回对闭包参数的引用?

来自分类Dev

Parallel.ForEach-是否可以访问修改的闭包?

来自分类Dev

在Swift中的Dispatch闭包中修改结构实例变量

来自分类Dev

为什么不能修改内联方法的闭包参数?

来自分类Dev

访问委托中的修改后的闭包

来自分类Dev

在Swift中的Dispatch闭包中修改结构实例变量

来自分类Dev

在闭包内修改全局变量 (Swift 4)

来自分类Dev

如何修改Deb包?

来自分类Dev

闭包如何存储对常量或值的引用

来自分类Dev

如何在方法中调用闭包

来自分类Dev

如何快速访问闭包内部的注释

来自分类Dev

如何快速使用可变参数闭包?

来自分类Dev

如何创建新的闭包单元对象?

来自分类Dev

如何包含Google闭包的依赖项

来自分类Dev

如何在PHP闭包中使用$ this?

来自分类Dev

如何将变量移出闭包?

来自分类Dev

Groovy NodeBuilder:如何传递闭包