用于Mezzio的类Tinker REPL(附代码)

80 阅读2分钟

今天在Laminas Slack中, 有人问是否有与Laravel的Tinker REPL相当的东西. 简短的回答是 "没有", 但我有一个建议给他们.

PHP REPL

我对这个问题的回答的第一部分是建议他们使用PHP REPL。

PHP 从 5.1.0 版开始就有 REPL,可以用php -a 调用。一旦启动,就可以做任何通常在 PHP 中做的事情,包括诸如包括文件、声明命名空间、声明类等等。

我经常想测试类是如何工作的,或者在不写脚本的情况下运行一次性的工作。 为了完成这些任务,我将包括Composer安装的自动加载器:

$ php -a
php > include './vendor/autoload.php';

一旦我这样做了,我就可以引用Composer自动加载的任何类、函数和常量,以及PHP暴露的任何东西。

Mezzio容器

Mezzio骨架在它的config/ 子目录下设置了一些文件,给我们提供了一些随时可以使用的工件。

第一个是config/config.php ,它聚合并返回所有应用程序的配置,包括来自配置提供者以及本地自动加载的配置文件(那些在config/autload/ )。如果你愿意,可以从REPL中直接转储这些信息:

$ php -a
php > include './vendor/autoload.php'; // we need autoloading for most config providers
php > $config = include './config/config.php';
php > var_export($config);

第二个,也是这个练习中更重要的,是config/container.php 。这个文件自动加载、配置并返回应用程序中定义的PSR-11DI容器。通过使用这种方法,我们可以让Mezzio对使用的具体容器保持中立,并让该文件为我们正确地实例化和配置它。 我们为一些容器提供了该文件的开箱版本,并有一个我们推荐的依赖配置规范,以确保第三方软件包提供的依赖配置可以被检测和使用。

因为这只是一个PHP文件,并返回PSR-11容器,我们可以包括这个文件并将其捕获到REPL中的一个变量:

$ php -a
php > include './vendor/autoload.php';
php > $container = include './config/container.php';

从那里,你可以拉出任何配置的服务,包括配置,并开始与它们互动:

php > include './vendor/autoload.php';
php > $container = include './config/container.php';
php > $config = $container->get('config');
php > echo $config['debug'] ? 'In debug mode' : 'In production mode';
php > $httpClient = $container->get(Http\Adapter\Guzzle7\Client::class);

Fin

虽然没有Tinker那么强大,但PHP REPL,加上Composer自动加载和配置的PSR-11容器,是一个与你的项目互动的绝妙工具。 我绝对可以推荐这个方法来玩和实验你的应用程序代码!