Magento2-カスタムコントローラーがエラーをスローする


12

この投稿に示すモジュールを作成しました。しかし、自分のコントローラーは機能しません。私はこのエラーメッセージを持っています:

回復可能なエラー:MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct()に渡される引数1は、Mento \ Framework \ App \ Action \ Contextのインスタンス、Dで呼び出されるMagento \ Framework \ ObjectManager \ ObjectManagerのインスタンスである必要があります:\ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php(97行目、D:\ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserNameで定義) 35行目のphp

ここに私のコントローラーコードがあります:

<?php
namespace MP\MyModule\Controller\Index;

class CheckUserName extends \Magento\Framework\App\Action\Action
{
    protected $_logger;
    protected $_objectManager;
    protected $_request;

/*
            \Psr\Log\LoggerInterface $logger, //log injection
            \Magento\Framework\App\Request\Http $request

        $this->_logger = $logger;

        $this->_logger->debug('CheckUserName_Constructor_Begin');

        $this->_request = $request;

        $this->_logger->debug('CheckUserName_Constructor_End');     


        */  

        /**
     * @var \Magento\Framework\View\Result\PageFactory
     */
    protected $resultPageFactory;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param \Magento\Framework\View\Result\PageFactory resultPageFactory
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory
    )
    {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute()
    {
        echo "Hello from Checkusername";
    }    
}
 ?>

var / generationフォルダーを削除した後のエラーメッセージは次のとおりです。

Warning: ltrim() expects parameter 1 to be string, object given in D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator\EntityAbstract.php on line 152

Notice: Uninitialized string offset: 0 in D:\xampp\htdocs\magento2\vendor\magento\framework\Autoload\ClassLoaderWrapper.php on line 81

Notice: Uninitialized string offset: 0 in D:\xampp\htdocs\magento2\vendor\composer\ClassLoader.php on line 317

Notice: Uninitialized string offset: 0 in D:\xampp\htdocs\magento2\vendor\composer\ClassLoader.php on line 349 exception 'Magento\Framework\Exception\LocalizedException' with message 'Source class "" for "Magento\Framework\App\Response\Http\Interceptor" generation does not exist.' in D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator.php:171 Stack trace: #0 D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator.php(100): Magento\Framework\Code\Generator->tryToLoadSourceClass('Magento\\Framewo...', Object(Magento\Framework\Interception\Code\Generator\Interceptor))
#1 D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator\Autoloader.php(35): Magento\Framework\Code\Generator->generateClass('Magento\\Framewo...')
#2 [internal function]: Magento\Framework\Code\Generator\Autoloader->load('Magento\\Framewo...')
#3 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\AbstractFactory.php(105): spl_autoload_call('Magento\\Framewo...')
#4 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\Compiled.php(88): Magento\Framework\ObjectManager\Factory\AbstractFactory->createObject('Magento\\Framewo...', Array)
#5 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\Compiled.php(130): Magento\Framework\ObjectManager\Factory\Compiled->create('Magento\\Framewo...')
#6 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\Compiled.php(67): Magento\Framework\ObjectManager\Factory\Compiled->get('Magento\\Framewo...')
#7 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\ObjectManager.php(57): Magento\Framework\ObjectManager\Factory\Compiled->create('Magento\\Framewo...', Array)
#8 D:\xampp\htdocs\magento2\vendor\magento\framework\App\Bootstrap.php(233): Magento\Framework\ObjectManager\ObjectManager->create('Magento\\Framewo...', Array)
#9 D:\xampp\htdocs\magento2\index.php(38): Magento\Framework\App\Bootstrap->createApplication('Magento\\Framewo...')
#10 {main}

1
@Claas MPが__construct関数にコメントしてから、もう一度確認します。また、magento var dirから生成フォルダーを削除します
Shaheer Ali

残念ながら、それは問題を解決しません。
ClassMP

生成フォルダーを削除しましたか?
Shaheerアリ

いいえ。/var/generationフォルダーのことですか?生成フォルダー内のコンテンツはどのように生成されますか?「magento setup:di:compile」で再コンパイルする必要がありますか?
ClassMP

はい、そうです。M2は、実行時にファクトリファイルを事前に生成します。いいえ、再コンパイルする必要はありません
Shaheer Ali

回答:


18

新しいCentOS開発環境にモジュールをデプロイした後、var / diフォルダーとvar / generationフォルダーを削除し、diを再コンパイルすると動作します。その前に、Win Xampp環境を使用しました。それは多くのトラブルを引き起こします...


2
これが機能することを確認できます。新しいルートを追加するときはいつでもそうしなければならないのは苦痛です。
アレックス

1
これは本当にCentOSのみの問題ですか?
ミール

2
@MirこれはOSの問題ではありません。@Alexは、依存性注入に変更を加えるたびに、php bin/magento setup:di:compileこのコマンドを実行するだけですべてを実行します。
ナヒド

7

私は同じ問題に遭遇しました。数時間の無意味なデバッグと私の頭を壁から叩いた後、私はうまくいく解決策を思いつきました。

最後に、私はすべてのアクションファイル名とクラス名をキャメルケースから変更しました

から:

D:\ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName.php

<?php
namespace MP\MyModule\Controller\Index;

class CheckUserName extends \Magento\Framework\App\Action\Action {
...
}

に:

D:\ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ Checkusername.php

class Checkusername extends \Magento\Framework\App\Action\Action {
...
}

Magento2の最新バージョンと何か関係がありますか?私は問題なくローカル環境で実行していますが、de compilerを実行すると問題になります。
awavi 16

サーバー環境と関係があります。私の経験から、最近Windows(またはMac)でモジュールを開発するとき、キャメルケースのファイル名とクラス名に問題はありませんが、ほとんどのLinuxディストリビューションではこれらの問題に遭遇するので、前述したように、ファイルとクラスに名前を付けるだけです。
ザンコレフ

問題は、Windowsの入力が弱いことです。つまり、「CheckUserName.php」はWindowsの「Checkusername.php」と同じように扱われます。ただし、Linuxは強く型付けされており、「CheckUserName.php」と「Checkusername.php」はまったく異なるものです。Windowsでの開発とCentOSでのテストを行っているため、時々同じ問題に遭遇します。
マイクレヴィ

7

Magentoルートディレクトリから次のコマンドを実行します。

php bin/magento setup:di:compile

これにより、Dependency Injection(DI)が再度コンパイルされ、問題はなくなります。


私はそのコマンドを正常に実行しましたが、管理者とフロントエンドの両方のショッピングカート全体を「ストリームを開くことができませんでした:/ var / www / html / mangento2 / vendor / colinmollenhour / cache-backendで許可が拒否されました」 -file / File.php。adminとフロントエンドで同じエラーが発生しました
VectorVortec

その後、コマンドを再度実行すると、ショッピングカートの両方の部分が通常の動作に戻りました。
VectorVortec

0

コントローラCheckUserName.phpファイルは次のようになります

MP / MyModule / Controller / Index / CheckUserName.php

<?php
namespace MP\MyModule\Controller\Index;

class CheckUserName extends \Magento\Framework\App\Action\Action
{

    /**
     * @var \Magento\Framework\View\Result\PageFactory
     */
    protected $resultPageFactory;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param \Magento\Framework\View\Result\PageFactory resultPageFactory
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory
    )
    {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute()
    {
        echo "Hello from Check username";
    }

}

キャッシュをクリアします。

その後、以下のURLを使用してコントローラーにアクセスできます

http://192.168.0.52/m2ee/my_module/index/CheckUserName/または http://192.168.0.52/m2ee/index.php/my_module/index/CheckUserName/

注:my_moduleは私のモジュールのフロントネームです。ここでフロントネームを置き換えることができます。

下の写真をご覧ください

ここに画像の説明を入力してください

動作しない場合はお知らせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.