基于@Flyingmana的回答,我做了一些挖掘并提出了解决方案。它适合我。
首先是我的解决方案,然后是一些解释。
我已经在test.php
magento实例的根目录中创建了一个名为的文件。
<?php
require __DIR__ . '/app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
/** @var \Magento\Framework\App\Http $app */
$app = $bootstrap->createApplication('TestApp');
$bootstrap->run($app);
然后,我在TestApp.php
与此内容相同的位置创建了一个文件。
<?php
class TestApp
extends \Magento\Framework\App\Http
implements \Magento\Framework\AppInterface {
public function launch()
{
//dirty code goes here.
//the example below just prints a class name
echo get_class($this->_objectManager->create('\Magento\Catalog\Model\Category'));
//the method must end with this line
return $this->_response;
}
public function catchException(\Magento\Framework\App\Bootstrap $bootstrap, \Exception $exception)
{
return false;
}
}
现在,我可以test.php
在浏览器中调用,TestApp :: launch()中放置的所有内容都将被执行。
现在,这为什么起作用:bootstrap类中
的方法createApplication
是最重要的部分。它创建一个应用程序类的实例。该方法createApplication
期望\Magento\Framework\AppInterface
包含2个方法的实现。
因此,我在TestApp
实现该接口的过程中创建了自己的类。我总是使方法catchException
返回,false
因为我不希望我的应用处理异常。万一有问题,只需在屏幕上打印即可。
然后我实现了该方法launch
。这个被称为\Magento\Framework\App\Bootstrap::run
。run
无论作为参数传递的应用程序是什么,此方法几乎都可以执行相同的操作。
唯一依赖于应用程序的是此行:
$response = $application->launch();
这意味着调用\Magento\Framework\App\Bootstrap::run
将初始化Magento env(也许做一些其他疯狂的事情……我还没有检查所有事情),然后launch
从应用程序中调用该方法。
这就是为什么您需要将所有脏代码放入该方法的原因。
然后\Magento\Framework\App\Bootstrap::run
调用$response->sendResponse();
其中$response
有什么launch
方法返回。
这就是为什么return $this->_response;
需要。它只是返回一个空响应。
我使我的应用程序类扩展了,\Magento\Framework\App\Http
因此我已经有了请求和响应参数(以及其他参数),但是您可以使您的类什么都不扩展。然后,您需要从\Magento\Framework\App\Http
类中复制构造函数。如果需要,可以在构造函数中添加更多参数。