laragear/discover

在目录中查找和筛选PHP类

v1.0.1 2024-03-03 22:51 UTC

This package is auto-updated.

Last update: 2024-09-13 08:02:38 UTC


README

Latest Version on Packagist Latest stable test run Codecov coverage Maintainability Sonarcloud Status Laravel Octane Compatibility

在目录中查找和筛选PHP类。

use Laragear\Discover\Facades\Discover;

foreach (Discover::in('Rules') as $rule) {
    // ...
};

成为赞助商

您的支持使我能够保持此包免费、最新和维护。或者,您可以 传播信息!

需求

  • PHP 8.1或更高版本
  • Laravel 10或更高版本(可选)

安装

您可以通过Composer安装此包

composer require laragear/discover

使用方法

Discover 会查找给定项目路径下的类。它包含流畅的方法来过滤要发现的类,例如方法名和属性名、接口、特性和属性。

让我们举一个简单的例子:列出所有包含 handle() 方法的 App\Scoreboards 或其子目录下的类。

use Laragear\Discover\Facades\Discover;

$classes = Discover::withMethod('handle')->in('Scoreboards')->allClasses();

Discover 类将自动解析您的项目路径,并使用您的应用程序路径(app)和命名空间(App)作为基础来查找匹配的类。

重要

发现的类必须是 PSR-4自动加载

应用程序路径和命名空间

大多数Laravel项目使用 appApp 分别作为应用程序路径和命名空间。库将使用这些,或者任何为您的应用程序设置的。

要发现 其他地方 的类,您需要使用 from() 方法来更改这两个设置。如果您没有设置命名空间,它将根据路径推断。

use Laragear\Discover\Facades\Discover;

// Discover starting at the "my-project/score" using "Score" as the base namespace. 
$classes = Discover::at('score')->classes();

// Discover starting at the "my-project/match" using the "Matches" as the base namespace.
$classes = Discover::at('/match', 'Matches')->classes();

命名空间

使用 in() 方法设置查找类的基命名空间。例如,如果我们想查找 App\Scoreboards 命名空间中的类,我们只需要设置 Scoreboards

use Laragear\Discover\Facades\Discover;

$classes = Discover::in('Scoreboards')->classes();

过滤器

您可以使用包含的过滤器来查找是另一个类的实例或包含特定成员或属性的类。

use Laragear\Discover\Facades\Discover;
use App\Score\Contracts\Score;
use App\Score\Concerns\FiresEvents;
use App\Attributes\Subscribable;

// Filter all classes instances of at least one of the given classes/interfaces. 
Discover::in('Scoreboards')->instancesOf(ScoreContract::class)->classes();

// Filter all classes with at least one of the given public methods.
Discover::in('Scoreboards')->withMethod('show')->classes();

// Filter all classes with at least one of the given public properties.
Discover::in('Scoreboards')->withProperty('user')->classes();

// Filter all classes with at least one of the given traits.
Discover::in('Scoreboards')->withTrait(FiresEvents::class)->classes();

// Filter all classes with at least one of the given attributes.
Discover::in('Scoreboards')->withAttribute(Subscribable::class)->classes();

附加过滤器

由于类作为 Collection 中的 ReflectionClass 实例返回,您可以进一步过滤列表。例如,过滤所有不以 Score 结尾的类名。

use Laragear\Discover\Facades\Discover;
use Illuminate\Support\Str;

$classes = Discover::in('Scoreboards')
    ->classes()
    ->filter(fn ($class) => Str::endsWith($class->getName(), 'Score'));

检索类

完成后,您可以使用 classes() 作为Collection检索找到的类。

use Laragear\Discover\Facades\Discover;

// Find all classes in `App\Scoreboards`.
$classes = Discover::in('Scoreboards')->classes();

Discover 类只在设置的命名空间中查找类。为了进行递归搜索,您可以使用 allClasses(),或者检索之前设置 recursive()

use Laragear\Discover\Facades\Discover;

// Find all classes in `App\Scoreboards` and deeper.
$classes = Discover::in('Scoreboards')->recursively()->classes();

// Same as...
$classes = Discover::in('Scoreboards')->allClasses();

无论如何,Discoverer 本身是可迭代的,所以您可以直接在 foreach 循环中使用它。

use Laragear\Discover\Facades\Discover;

foreach (Discover::recursive()->in('Scoreboards') as $class) {
    // ...
}

您还可以直接传递任何方法 Collection 方法或高阶方法,这可以为您节省一些按键。

use Laragear\Discover\Facades\Discover;

$classes = Discover::in('Scoreboards')->map->isFinal();

在Laravel之外

Discoverer 可以用于Laravel项目之外,因为它只需要 illuminate/support 库。您可能需要手动设置项目根路径。

use Laragear\Discover\Discoverer;

$discoverer = new Discoverer(__DIR__ . '/..');

foreach ($discoverer->at('software', 'Application')->in('Events') as $event) {
    // ...
}

Laravel Octane 兼容性

  • 没有使用过时的应用程序实例的单例。
  • 没有使用过时的配置实例的单例。
  • 没有使用过时的请求实例的单例。
  • 没有写入静态属性。

使用此包与Laravel Octane不应有任何问题。

安全

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

许可证

本特定软件包版本在发布时受MIT许可协议的约束。

LaravelTaylor Otwell的商标。版权所有 © 2011-2024 Laravel LLC。