nette/robot-loader

🍀 Nette RobotLoader:高性能且易于使用的自动加载器,可在您的应用程序中搜索和自动加载类。

v4.0.2 2024-06-18 20:19 UTC

README

RobotLoader

Downloads this Month Tests Coverage Status Latest Stable Version License

简介

RobotLoader是一款工具,它可以为您整个应用程序(包括第三方库)提供自动加载类的便利。

✅ 移除所有 require
✅ 不需要严格的目录或文件命名约定
✅ 极快
✅ 无需手动缓存更新,一切自动运行
✅ 成熟、稳定且广泛使用的库

因此,我们可以忘记这些熟悉的代码块

require_once 'Utils/Page.php';
require_once 'Utils/Style.php';
require_once 'Utils/Paginator.php';
...

 

支持我

你喜欢RobotLoader吗?你期待新功能吗?

Buy me a coffee

谢谢!

 

安装

您可以下载RobotLoader作为单个独立文件RobotLoader.php,您可以通过在脚本中使用require来包含它,并立即享受整个应用程序的舒适自动加载。

require '/path/to/RobotLoader.php';

$loader = new Nette\Loaders\RobotLoader;
// ...

如果您正在使用Composer构建应用程序,您可以通过以下方式安装它

composer require nette/robot-loader

它需要PHP版本8.0,并支持PHP 8.4。

 

用法

类似于Google机器人爬取和索引网页的方式,RobotLoader遍历所有PHP脚本,并记录下它找到的类、接口、特性和枚举。然后,它将结果存储在缓存中,以供后续请求使用。您只需指定它应该遍历哪些目录以及在哪里存储缓存。

$loader = new Nette\Loaders\RobotLoader;

// Directories for RobotLoader to index (including subdirectories)
$loader->addDirectory(__DIR__ . '/app');
$loader->addDirectory(__DIR__ . '/libs');

// Set caching to the 'temp' directory
$loader->setTempDirectory(__DIR__ . '/temp');
$loader->register(); // Activate RobotLoader

就是这样,从现在开始,我们不需要使用require。太棒了!

如果RobotLoader在索引过程中遇到重复的类名,它将抛出异常并通知您。RobotLoader还需要加载未知类时自动更新缓存。我们建议在生产服务器上关闭此功能,请参阅[#Caching]。

如果您希望RobotLoader跳过某些目录,请使用$loader->excludeDirectory('temp')(可以多次调用或传递多个目录)。

默认情况下,RobotLoader通过抛出ParseError异常来报告PHP文件中的错误。您可以使用$loader->reportParseErrors(false)来抑制此功能。

 

PHP文件分析器

RobotLoader还可以仅用于在PHP文件中查找类、接口、特性和枚举,而无需使用自动加载功能。

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');

// Scans directories for classes/interfaces/traits/enums
$loader->rebuild();

// Returns an array of class => filename pairs
$res = $loader->getIndexedClasses();

即使在这种使用方式下,您也可以利用缓存。这确保了未更改的文件不会被重新扫描。

$loader = new Nette\Loaders\RobotLoader;
$loader->addDirectory(__DIR__ . '/app');

// Set caching to the 'temp' directory
$loader->setTempDirectory(__DIR__ . '/temp');

// Scans directories using cache
$loader->refresh();

// Returns an array of class => filename pairs
$res = $loader->getIndexedClasses();

 

缓存

RobotLoader非常快,因为它巧妙地使用了缓存。

在开发过程中,您几乎感觉不到它在后台运行。它持续更新其缓存,考虑到类和文件可能被创建、删除、重命名等。并且它不会重新扫描未更改的文件。

另一方面,在生产服务器上,我们建议使用$loader->setAutoRefresh(false)(在Nette应用程序中,这会自动发生)关闭缓存更新,因为文件不会更改。同时,当上传新版本到托管时,需要清除缓存

在缓存尚不存在时,初始文件扫描对于大型应用程序可能需要一点时间。RobotLoader内置了对缓存奔溃的预防。这种情况是指生产服务器上的大量并发请求会触发RobotLoader,由于缓存尚不存在,它们都会开始扫描文件,这会超负荷运行服务器。幸运的是,RobotLoader以这样的方式工作,即只有第一个线程索引文件、创建缓存,其余的线程等待然后使用缓存。

 

PSR-4

如今,您可以在遵循PSR-4的同时使用Composer进行自动加载。简单来说,这是一个命名空间和类名与目录结构以及文件名相对应的系统,例如,App\Router\RouterFactory将会在文件/path/to/App/Router/RouterFactory.php中。

RobotLoader不依赖于任何固定的结构,因此在您不想让目录结构完全像PHP命名空间一样设计,或者在开发历史上未使用此类约定的应用程序时非常有用。同时使用这两个加载器也是可能的。

如果您喜欢RobotLoader,请现在进行捐赠。谢谢您!