nette / robot-loader
🍀 Nette RobotLoader:高性能且易于使用的自动加载器,可在您的应用程序中搜索和自动加载类。
Requires
- php: 8.0 - 8.3
- ext-tokenizer: *
- nette/utils: ^4.0
Requires (Dev)
- nette/tester: ^2.4
- phpstan/phpstan: ^1.0
- tracy/tracy: ^2.9
- dev-master / 4.0.x-dev
- v4.0.2
- v4.0.1
- v4.0.0
- v3.4.x-dev
- v3.4.2
- v3.4.1
- v3.4.0
- v3.3.x-dev
- v3.3.2
- v3.3.1
- v3.3.0
- v3.2.x-dev
- v3.2.5
- v3.2.4
- v3.2.3
- v3.2.2
- v3.2.1
- v3.2.0
- v3.1.x-dev
- v3.1.4
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
- v3.0.x-dev
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- v2.4.x-dev
- v2.4.5
- v2.4.4
- v2.4.3
- v2.4.2
- v2.4.1
- v2.4.0
- v2.3.x-dev
- v2.3.2
- v2.3.1
- v2.3.0
- 2.2.x-dev
- v2.2.2
- v2.2.1
- v2.2.0
- dev-standalone
This package is auto-updated.
Last update: 2024-09-18 20:59:36 UTC
README
简介
RobotLoader是一款工具,它可以为您整个应用程序(包括第三方库)提供自动加载类的便利。
✅ 移除所有 require
✅ 不需要严格的目录或文件命名约定
✅ 极快
✅ 无需手动缓存更新,一切自动运行
✅ 成熟、稳定且广泛使用的库
因此,我们可以忘记这些熟悉的代码块
require_once 'Utils/Page.php'; require_once 'Utils/Style.php'; require_once 'Utils/Paginator.php'; ...
支持我
你喜欢RobotLoader吗?你期待新功能吗?
谢谢!
安装
您可以下载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,请现在进行捐赠。谢谢您!