mpyw/unclosure

适用于 Laravel PDO 的闭包解包器

v3.0.0 2021-11-18 12:21 UTC

This package is auto-updated.

Last update: 2024-09-13 10:14:54 UTC


README

适用于 Laravel PDO 的闭包解包器。

要求

安装

composer require mpyw/unclosure

示例

在建立数据库连接后调用 PDO::setAttribute()

<?php

use Mpyw\Unclosure\Value;
use PDO;

function withEmulation(PDO $pdo, bool $enabled): PDO
{
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $enabled);
    return $pdo;
}

$connector = function (string $dsn) {
    return new PDO($dsn);
};

// Eager Evaluation
$pdo = Value::withCallback($connector('sqlite::memory:'), 'withEmulation', true);

// Lazy Evaluation
$pdo = Value::withCallback($connector, 'withEmulation', true);
$pdo = $pdo('sqlite::memory:');

暂时更改 PDO 属性

<?php

use Mpyw\Unclosure\Value;
use PDO;

function switchingEmulationTo(bool $enabled, &$pdo, callable $callback, ...$args)
{
    return Value::withEffect(
        $pdo,
        function (PDO $pdo) use ($enabled) {
            $original = $pdo->getAttribute(PDO::ATTR_EMULATE_PREPARES);
            $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $enabled);
            
            return function (PDO $pdo) use ($original) {
                $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, $original);
            };
        },
        $callback,
        ...$args
    );
}

$connector = function (string $dsn) {
    return new PDO($dsn);
};

// Eager Evaluation
$pdo = $connector('sqlite::memory:');
switchingEmulationTo(true, $pdo, function () use ($pdo) {
    // Run queries that require prepared statement emulation
});

// Lazy Evaluation
$pdo = $connector;
switchingEmulationTo(true, $pdo, function () use (&$pdo) {
    $pdo = $pdo('sqlite::memory:');
    
    // Run queries that require prepared statement emulation
});

API

Value::withCallback()

static mixed|Closure withCallback(mixed|Closure $value, callable $callback, mixed ...$args)

调用 $callback($value, ...$args) 或将其调用封装到 Closure 中。

  • 当你传递 $value 作为 Closure
    • 返回封装后的 Closure,它返回 $callback($value(), ...$args)
  • 当你传递 $value 作为原始值时
    • 返回 $callback($value, ...$args)

参数和返回值

(A) $value

$value(mixed ...$initialArgs): mixed

(B) $callback

$callback(mixed $value, ...$args): mixed

(C) 返回值

*(mixed ...$initialArgs): mixed

Value::withEffect()
Value::withEffectForEach()

public static withEffect(mixed|Closure &$value, callable $configurator, callable $callback, mixed ...$args): mixed
public static withEffectForEach((mixed|Closure)[] &$values, callable $configurator, callable $callback, mixed ...$args): mixed

调用 $callback(...$args),监视 &$value 上的新赋值。 你可以在自己的 $callback 中有条件地解包 $value

  • 当你传递 $value 作为 Closure
    • 如果 $value 已经被解包,则通过 $configurator 应用配置。
    • 如果 $value 仍然是 Closure,则取消所有配置。
  • 当你传递 $value 作为原始值时
    • 通过 $configurator 的配置立即应用。

参数和返回值

(A) &$value

*(): mixed

(B) $configurator

$configurator(mixed $value): ?callable

(C) $configurator 返回值

*(mixed $value): void

(D) $callback

$callback(...$args): mixed