Laravel Eloquent:chunk Closure中的访问方法参数

时间:2015-06-07 09:34:03

标签: php laravel static scope eloquent

我需要将一个匿名函数传递给Eloquent模型上的静态方法,并让该静态方法在块闭包内调用闭包。目标是类似于以下代码:

class MyModel extends Eloquent {
    // ... table stuff
    public static function doSomething (Closure $thing) {
        $dispatcher = static::getEventDispatcher();
        static::unsetEventDispatcher();
        static::chunk(100, function ($records) {
            foreach($records as $model) {
                $thing($model); // not set in this scope
            }
        });
        static::setEventDispatcher($dispatcher);
    }
}
//...
MyModel::doSomething(function($m){/*some crypto stuff*/});

$thing未设置,因为它超出了范围。我想知道是否有一些技巧可以使这项工作。目前,我使用的是非静态方法,并在$thing表示的闭包周围调用chunk:

class MyModel extends Eloquent {
    public function doSomething (Closure $thing) {
        // unset event dispatcher
        $thing($this);
        // reset event dispatcher
    }
}

MyModel::chunk(100, function ($records) {
    foreach($records as $model) {
        $model->doSomething(function($m){/*some crypto stuff*/});
    }
}

这是次优的,因为我每次要调用doSomething时都要编写块循环,并且事件调度程序被删除并为每条记录重置(或者甚至更糟:我必须记住在调用chunk之前处理事件调度程序,此时我甚至可能不会尝试合并我的代码。

任何人都知道任何可以使这项工作的技巧吗?

1 个答案:

答案 0 :(得分:1)

use关键字允许匿名函数从父作用域继承变量。

class MyModel extends Eloquent {
    // ... table stuff
    public static function doSomething (Closure $thing) {
        $dispatcher = static::getEventDispatcher();
        static::unsetEventDispatcher();
        // note the use keyword
        static::chunk(100, function ($records) use ($thing) {
            foreach($records as $model) {
                $thing($model); // not set in this scope
            }
        });
        static::setEventDispatcher($dispatcher);
    }
}

匿名函数文档showMessageuse关键字显示在示例3中。