@Flyingmanaの回答に基づいて、少し掘り下げて解決策を考え出しました。私のために働くことは継ぎ目です。
最初に私の解決策、次にいくつかの説明。magentoインスタンスのルートで
呼び出されるファイルを作成しましたtest.php。
<?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()に配置されたすべてが実行されます。
さて、なぜこれが機能するのか:ブートストラップクラス
のメソッドcreateApplicationが最も重要な部分です。アプリケーションクラスのインスタンスを作成します。このメソッドcreateApplicationは、\Magento\Framework\AppInterface2つのメソッドを含むの実装を想定しています。
そこで、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クラスからコンストラクターをコピーする必要があります。必要に応じて、コンストラクタにパラメータを追加することもできます。