此包已被废弃,不再维护。未建议替换包。

使用有用的全局助手为您的 Laravel 项目注入活力。

v3.2.0 2021-09-02 00:34 UTC

This package is auto-updated.

Last update: 2022-03-30 01:54:32 UTC


README

Regine Tholen - Unsplash (UL) #ojGvj7CE5OQ

Latest Stable Version License Coverage Status

Larahelp

使用超过 25 个有用的全局助手为您的 Laravel 项目注入活力。

要求

  • Laravel 8.x 或更高版本
  • PHP 8.0 或更高版本

安装

您可以通过 composer 安装此包

composer require darkghosthunter/larahelp

此包专注于后端。如果您想使用视图助手,我建议您使用 自定义 Blade 指令

使用方法

此包包含有用的全局助手,可以让您的项目将几乎任何内容转换为美丽的 一行代码

app_call in_development route_is
call_existing logged_in shadow
created methods_of sleep_between
data_update missing_trait taptap
delist none_of undot_path
diff object_assign until
dot_path ok user
enclose period weekend
files period_from weekstart
has_trait pipe which_of
hashy remember yesterday
in_console route_is

app_call()

使用应用程序容器执行可调用对象。

$result = app_call('\App\MyService\Service@createSomething');

call_existing()

如果对象实例中存在动态方法或宏,则调用它。它支持宏和静态方法。

class Something {
    public function foo() {
        return 'bar';
    }
}

call_existing(new Something, 'bar'); // null

call_existing(new Something, 'foo'); // "bar"

created()

返回一个 HTTP 201 响应(OK,已创建),可选包含内容。

public function store(Request $request): Response
{
    // ...
    
    return created([$post->getKeyName() => $post->getKey()];
}

data_update()

使用接收它的回调函数更新数组或对象中的项目。

$array = [
    'foo' => [
        'bar' => null
    ]
];

data_update($array, 'foo.bar', function ($value) {
    if ($value === null) {
        return 'baz';
    }
})


// [
//     'foo' => [
//         'bar' => 'baz'
//     ]
// ];

即使键不存在,值也会被更新。

delist()

返回数组的值,因此可以将它们列在变量中。它可以接受一个可选的偏移量,以删除给定数量的第一个键。

$array = [
    'foo'  => 'bar',
    'baz'  => 'qux',
    'quux' => 'quuz',
]

[$baz, $quux] = delist($array, 1);

diff()

返回两个日期之间的秒数或任何其他给定单位的差值。

$seconds = diff('now', '15th may');

$minutes = diff('today', now())

dot_path()

将相对路径转换为点表示法。

$path = dot_path('files/user_id_312/videos/');

// files.user_id_312.videos

这不会验证文件路径。您应该手动将文件名追加到点路径中。

enclose()

如果值或可调用对象不是可调用的,则将其包装在闭包中。

$enclosed = enclose('foo');

$enclosed();

// "foo"

files()

返回本地文件系统助手,或路径中的文件列表。

$content = files()->get('text.txt');

has_trait()

递归检查对象是否使用单个特性。

trait Child {
    // ..
}

trait Parent {
    use Child; 
    // ..
}

class Foo {
    use Parent;
}

has_trait(Foo::class, Child::class);

// true

hashy()

从字符串创建一个小型BASE64编码的MD5哈希值,用于便携式校验和。

这对于哈希大量文本墙或文件非常有用,同时将128位哈希压缩到24个字符的字符串。

$hash = hashy('This is a hashable string');

// "TJYa8+63dRbdN6w44shX1g=="

您可以使用相同的函数来比较可哈希字符串与哈希,以检查它是否被修改。

hashy('This is a hashable string', 'TJYa8+63dRbdN6w44shX1g==');

// true

hashy('This is a hashable string!', 'TJYa8+63dRbdN6w44shX1g==');

// false

in_console()

检查应用程序是否在控制台运行,例如使用Artisan或PHPUnit。

if (in_console()) {
    return "We're in console";
}

它还接受一个可调用对象,如果条件为真,将执行该可调用对象。

$result = in_console(fn() => 'foo');

// "foo"

in_development()

检查应用程序是否在开发环境中运行:devdevelopmentlocal

if (in_development()) {
    return "Do anything, it doesn't matter!";
}

它还接受一个可调用对象,如果条件为真,将执行该可调用对象。

$result = in_development(fn() => 'foo');

// "foo"

logged_in()

在用户登录时执行单个回调。

它基本上在执行回调时登录和注销用户,这在guest路由上非常有用。

use App\Models\User;

$user = User::find(1);

$post = logged_in($user, function (User $user) {
    return $user->post()->create([
        // ..
    ]);
});

如果已经有一个用户登录,它将抛出异常。

methods_of()

返回给定类或对象的所有公共方法集合。

use Illuminate\Support\Collection;

$methods = methods_of(Collection::class)

return $methods->has('make');

// true

missing_trait()

递归检查对象是否未使用特性。

trait Parent {
    // ..
}

class Foo {
    use Parent;
}

missing_trait(Foo::class, Child::class);

// true

none_of()

检查与主题比较的选项中没有任何一个返回真值。

$subject = 'foo';

none_of('foo', ['bar', 'baz', 'qux']);

// false

使用可调用对象,它将接收主题和被比较的键。

$subject = 'foo';

none_of('foo', ['bar', 'baz', 'qux'], fn ($subject, $compared) => $subject === $compared);

// false

object_assign()

使用点表示法递归地将值数组分配给对象。

$object = new stdClass();

object_assign($object, ['foo' => 'bar']);

echo $object->foo; // "bar"

ok()

返回HTTP 204响应(OK,无内容)。

public function send(Request $request)
{
    // ...
    
    return ok();
}

period()

返回给定开始和结束或区间的周期。周期对于根据开始、结束和给定每个发生之间的时间获取多个日期非常有用。

创建周期最常见的方法是定义开始、发生次数和间隔数量。

$periods = period('now', 4, '15 minutes');

或者,您可以指定一个开始、一个结束以及到达该结束的时间间隔。

$period = period('today', 'last day of this month', '3 days');

完成之后,您可以使用foreach循环迭代每个时间点。

foreach (period('today', 'last day of this month', '3 days') as $datetime) {
    echo $datetime->toDateTimeString();
}

// 2015-07-21 00:00:00
// 2015-07-24 00:00:00
// 2015-07-27 00:00:00
// 2015-07-30 00:00:00

period_from()

从给定日期返回下一个或上一个周期,默认为排除。

这对于知道给定时间(如当前时间)的下一次或上一次时刻非常方便。

$period = period('2015-07-06 00:00:00', '2015-07-26 00:00:00', '1 week');

period_from($period, '2015-07-13');

// 2015-07-13

通过将$after设置为false,该函数还可以检查前一个日期。

$period = period('2015-07-06 00:00:00', '2015-07-26 00:00:00', '1 week');

period_from($period, '2015-07-06');

// 2015-07-13

比较的日期是排除的。要包括日期作为包含,将$inclusive设置为true

pipe()

通过管道发送对象。

pipe(10, [
    fn($integer, $next) => $next($integer + 10);
    fn($integer, $next) => $next($integer - 5);
])

// 15

remember()

从缓存中获取项,如果项不存在则存储默认值。

remember('foo', 60, function() {
    return 'bar';
})

如果没有设置 ttl,而是第二个参数提供一个回调,它将永久存储。

remember('foo', function () {
    return 'bar';
})

它支持原子锁,使用相同的名称键创建。它将锁定键并等待相同的时间。

remember('foo', 60, function() {
    return 'bar';
}, 20);

这可以用来避免缓存数据竞争,其中多个进程因为缓存键尚未填充而运行相同的回调。

route_is()

确定当前路由的名称是否匹配给定的模式。

if (route_is('dahsboard.*')) {
    return 'You are in the dashboard';
}

shadow()

如果存在则在一个对象上调用方法,否则返回false。它支持宏。

if ($rendered = shadow($mayRender, 'render')) {
    return $rendered;
}

return response((string)$mayRender);

sleep_between()

在多次执行之间睡眠时运行回调,返回所有结果的集合。

use App\Models\User;

sleep_between(3, 1000, fn() => User::query()->inRandomOrder()->value('name'))

// [
//     'john',
//     'michel',
//     'maria',
// ]

taptap()

使用给定值调用给定的闭包然后返回值,两次。

use App\Models\User;
use App\Notifications\Message;

return taptap(User::find(1))->notify(new Message('Hello!'))->save();

undot_path()

将路径从点表示法转换为相对路径。

$path = undot_path('files.user_id_312.videos');

// files/user_id_312/videos/

until()

返回日期到期望日期的时间间隔。

until('now', 'next month')->total('days');

// 25

user()

如果有的话,返回当前认证用户。

user()?->name;

// "John Doe"

weekend()

返回一周的结束。它支持设置周末是星期几。

weekend()->toDateTimeString();

// 2015-07-05 23:59:59

weekend('now')->toDateTimeString();

// 2015-07-13 23:59:59

weekstart()

返回一周的结束。它支持设置星期从哪一天开始。

weekstart()->toDateTimeString();

// 2015-06-28 00:00:00

weekstart('now')->toDateTimeString();

// 2015-07-06 00:00:00

which_of()

返回比较或回调返回true的选项的键。

$which = which_of('foo', [0 => 'baz', 1 => 'bar', 2 => 'foo'])

// 2

如果回调返回了一些真实的东西,那么将使用那个值。

$which = which_of(
    'foo',
    ['baz', 'bar', 'foo'], 
    fn($subject, $option) => $subject === $option ? 'cougar' : false)
);

// "cougar"

yesterday()

返回昨天的日期。

// 2015-07-12 17:30:00
yesterday();

// 2015-07-11 00:00:00

缺少一个助手?

如果你有助手的想法,请作为问题提交。具有测试和良好代码质量的PR将获得优先权。

安全

如果你发现任何安全相关的问题,请通过电子邮件darkghosthunter@gmail.com而不是使用问题跟踪器。

许可

MIT许可(MIT)。请参阅许可文件以获取更多信息。