Magento2 - Kontroler Kustom melempar kesalahan

12

Saya membuat modul yang ditunjukkan pada posting ini . Tapi controller saya sendiri tidak berfungsi. Saya mendapat pesan kesalahan ini:

Kesalahan yang Dapat Dipulihkan: Argumen 1 yang diteruskan ke MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () harus merupakan instance dari Magento \ Framework \ App \ Action \ Context, instance dari Magento \ Framework \ ObjectManager \ ObjectManager yang diberikan, dipanggil dalam D : \ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php on line 97 dan didefinisikan dalam D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName. php on line 35

Ini kode pengontrol saya:

<?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";
    }    
}
 ?>

Ini pesan kesalahan setelah menghapus folder 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}
ClassMP
sumber
1
@Claas MP berkomentar fungsi __construct Anda dan kemudian periksa lagi. dan juga hapus folder pembuatan dari magento var dir Anda
Shaheer Ali
Hai Shaheer sayangnya itu tidak memperbaiki masalah.
ClassMP
apakah Anda menghapus folder pembuatan?
Shaheer Ali
Tidak. Maksud Anda folder / var / generation? Bagaimana konten dalam folder generasi akan dihasilkan? Apakah saya perlu melakukan kompilasi ulang dengan "pengaturan magento: di: compile"?
ClassMP
ya maksud saya itu. M2 pre menghasilkan file pabrik pada saat dijalankan. Tidak, Anda tidak perlu melakukan kompilasi ulang
Shaheer Ali

Jawaban:

18

Setelah memasang modul pada lingkungan dev CentOS baru, hapus folder var / di dan var / generation dan kompilasi ulang di, ia berfungsi. Sebelum itu saya menggunakan lingkungan Win Xampp. Itu menyebabkan banyak masalah ...

ClassMP
sumber
2
Dapat mengkonfirmasi ini berfungsi, itu menyakitkan bahwa Anda harus melakukan itu setiap kali menambahkan rute baru
Alex
1
Apakah ini benar-benar masalah CentOS saja?
Mir
2
@Mir ini bukan masalah OS. @Alex setiap kali Anda melakukan beberapa perubahan pada ketergantungan injeksi, Anda hanya perlu menjalankan php bin/magento setup:di:compileperintah ini akan melakukan segalanya.
Nahid
7

Saya mengalami masalah yang sama. Setelah beberapa jam melakukan debugging yang tidak berguna dan membenturkan kepala saya dari dinding, saya menemukan solusi yang bekerja dengan baik untuk saya.

Pada akhirnya saya mengganti nama semua nama file tindakan dan nama kelas dari unta-case yaitu

Dari:

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 {
...
}

Untuk:

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

class Checkusername extends \Magento\Framework\App\Action\Action {
...
}
Zan Kolev
sumber
Apakah ada hubungannya dengan Magento2 versi terbaru? Saya memilikinya berjalan di lingkungan lokal saya tanpa masalah, namun ketika saya menjalankan de compiler adalah ketika datang ke masalah itu.
awavi
Ini ada hubungannya dengan lingkungan server. Dari pengalaman saya, ketika saya mengembangkan modul pada Windows (atau Mac belakangan ini) saya tidak memiliki masalah dengan nama file unta-kasus dan nama kelas, tetapi di bawah kebanyakan distro linux saya mengalami masalah ini, jadi saya merasa lebih mudah untuk beri nama file dan kelas seperti yang saya sebutkan sebelumnya.
Zan Kolev
Saya cukup yakin masalahnya adalah Windows diketik dengan lemah, yang berarti 'CheckUserName.php' diperlakukan sama dengan 'Checkusername.php' di Windows. Namun Linux sangat diketik artinya 'CheckUserName.php' dan 'Checkusername.php' adalah dua hal yang sama sekali berbeda. Saya mengalami masalah yang sama dari waktu ke waktu karena saya melakukan pengembangan pada Windows dan pengujian pada CentOS.
Mike Levy
7

Dari direktori root Magento Anda jalankan perintah berikut:

php bin/magento setup:di:compile

Ini akan mengkompilasi Injeksi Ketergantungan (DI) lagi dan, masalah Anda akan hilang.

Nahid
sumber
Saya menjalankan perintah itu dengan sukses, katanya, dan itu menjatuhkan seluruh keranjang belanja baik admin maupun frontend dengan kesalahan, "gagal membuka streaming: Izin ditolak di / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -file / File.php. Itu memiliki kesalahan yang sama di admin dan frontend.
VectorVortec
Kemudian saya menjalankan perintah, lagi, dan kedua bagian kereta belanja kembali ke perilaku normal mereka.
VectorVortec
0

CheckUserName.phpFile pengontrol Anda terlihat seperti di bawah ini

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";
    }

}

bersihkan cache.

setelah itu Anda dapat mengakses controller Anda dengan menggunakan URL di bawah ini

http://192.168.0.52/m2ee/my_module/index/CheckUserName/ atau http://192.168.0.52/m2ee/index.php/my_module/index/CheckUserName/

Catatan: my_module adalah nama depan modul saya, Anda dapat mengganti nama depan Anda di sini.

lihat di bawah foto Sisi saya ini berfungsi

masukkan deskripsi gambar di sini

beri tahu saya jika itu tidak berhasil.

Bojjaiah
sumber