@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\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
クラスからコンストラクターをコピーする必要があります。必要に応じて、コンストラクタにパラメータを追加することもできます。