Magento 2でコントローラを作成する方法

What to Consider While Choosing a Magento Hosting Service

特にコントローラは、モジュール開発シリーズ、そして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」というメッセージが表示されます。

 

デモを申し込む

弊社の専門家は最適なソリューションをサポートさせて頂きます。

►►►サービスについて