
特にコントローラは、モジュール開発シリーズ、そしてPHP MVCフレームワークにおいて重要なものの一つです。その機能は、リクエストを受け取り、処理し、ページをレンダリングすることです。
Magento 2では、コントローラはモジュールのControllerフォルダに1つ以上のファイルがあり、execute()メソッドを含むクラスのアクションを含みます。コントローラには、フロントエンドコントローラとバックエンドコントローラの2種類があります。これらは一般的に似たようなワークフローを持っていますが、adminコントローラは少し違います。管理画面のコントローラには、パーミッションをチェックするメソッドがあり、フォームキーを呼び出します。
目次
1. コントローラはどのように動作するのか?
例えば、エンドユーザー(ブラウザやコマンドライン)からのリクエストを受信します:
http://example.com/route_name/controller/action
- route_nameは、routes.xmlで設定された一意の名前です。
- controllerは、Controllerフォルダ内のフォルダです。
- actionは、リクエストを処理するexecuteメソッドを持つクラスです。
Magentoシステムで重要なものの一つにfrontController(Magento®Framework\App\FrontController)があり、常にリクエストを受け取り、ルートコントローラ、ルート名によるアクションを行います。 リクエストをルーティングする例を見てみましょう。
foreach ($this->_routerList as $router) {
try {
$actionInstance = $router->match($request);
…
}
コントローラクラスのアクションが見つかった場合、execute()メソッドが実行されます。
Magento 2でコントローラを作成するには?
コントローラを作成するには、モジュールのControllerフォルダの中にフォルダを作成し、その中にアクションクラスを宣言する必要があります。例えば、Smartosc_HelloWorldモジュールにindex controllerとindex actionを作成します。
ステップ1: routes.xmlファイルの作成
ファイル:app/code/Smartosc/HelloWorld/etc/frontend/routes.xml
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
<router id="standard">
<route frontName="helloworld" id="helloworld">
<module name="Smartosc_HelloWorld"/>
</route>
</router>
</config>
ステップ2:コントローラファイルの作成
<?php
namespace Smartosc\HelloWorld\Controller\Index;
class Index extends \Magento\Framework\App\Action\Action
{
protected $_pageFactory;
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $pageFactory)
{
$this->_pageFactory = $pageFactory;
return parent::__construct($context);
}
public function execute()
{
return $this->_pageFactory->create();
}
}
ご覧の通り、全てのコントローラは、アクションクラスのexecute()メソッドを呼び出すディスパッチメソッドを持つ、Magento®Framework®Action®クラスを拡張する必要があります。このexecute()メソッドでは、コントローラの全てのロジックを記述し、リクエストに対するレスポンスを返します。
ステップ3:レイアウトファイルの作成
ファイル:app/code/Smartosc/HelloWorld/view/frontend/layout/helloworld_index_index.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<referenceContainer name="content">
<block class="Smartosc\HelloWorld\Block\Index" name="helloworld_index_index" template="Smartosc_HelloWorld::index.phtml" />
</referenceContainer>
</page>
ステップ4:ブロックファイルの作成
ファイル:app/code/Smartosc/HelloWorld/Block/Index.php
<?php
namespace Smartosc\HelloWorld\Block;
class Index extends \Magento\Framework\View\Element\Template
{
}
ステップ5: テンプレートファイルの作成
ファイル:app/code/Smartosc/HelloWorld/view/frontend/templates/index.phtml
<h2>Welcome to Smartosc.com</h2>
ステップ6:Magentoのキャッシュをフラッシュする
ステップ7:テストの実行
ブラウザを開いて、以下の場所に移動します:
http://<yourhost.com>/helloworld/index/index
又
http://<yourhost.com>/helloworld/
2. パーミッション – ACL
アドミンコントローラには、パーミッションをチェックするメソッドがあります。例を挙げてみましょう
protected function _isAllowed()
{
return $this->_authorization->isAllowed('Magento_AdminNotification::show_list');
}
3. Magento 2 コントローラーのその他の方法
\Magento\Framework\App\Action\Action\このクラスには、2つの重要なメソッドがあります。_forwardと_redirectです。
_forward() protected functionは、リクエストを編集して別のコントローラ/アクションクラスに転送します。これはリクエストのURLを変更するものではありません。例えば、「Forward」と「Hello World」という2つのアクションがあるとします。
namespace Smartosc\HelloWorld\Controller\Test;
class Forward extends \Magento\Framework\App\Action\Action
{
public function execute()
{
$this->_forward('hello');
}
}
http://example.com/route_name/test/forward にリクエストすると、その結果が画面に表示されます。
Hello World! Welcome to Smartosc.com
また、フォワード時のリクエストのコントローラ、モジュール、set paramを変更することができます。詳しくは、_forward()関数をご確認ください。
protected function _forward($action, $controller = null, $module = null, array $params = null)
{
$request = $this->getRequest();
$request->initForward();
if (isset($params)) {
$request->setParams($params);
}
if (isset($controller)) {
$request->setControllerName($controller);
// Module should only be reset if controller has been specified
if (isset($module)) {
$request->setModuleName($module);
}
}
$request->setActionName($action);
$request->setDispatched(false);
}
リダイレクト方式
このメソッドは、別のコントローラ/アクションクラスに転送され、レスポンスヘッダとリクエストURLも変更されます。上記の例で、_forward()メソッドをこの_redirect()メソッドに置き換えると、以下のようになります:
$this->_redirect('*/*/hello');
その後、http://example.com/route_name/test/forward のURLからアクセスすると、URLは http://example.com/route_name/test/hello に変更され、「Hello World! Welcome to Smartosc.com」というメッセージが表示されます。