传递给 Controller\foo 的参数 1 必须是 Controller\foo 的实例 [英] Argument 1 passed to Controller\foo must be an instance of Controller\foo

查看:26
本文介绍了传递给 Controller\foo 的参数 1 必须是 Controller\foo 的实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 Zend Framework 非常陌生.我正在关注可靠的 Zend 教程站点(从 A 到 Z).我被困在这里...请帮助我

I am very new in Zend Framework. Im following solid Zend Tutorial site (A to Z)..Im stuck here..please help me

来自 SO 的一些解决方案并没有太大帮助..完全做但没有做..与下面相同的帖子Zend Framework 2:Argument 1 传递给 Album\Controller\AlbumController::__construct() 必须是 Album\Controller\AlbumTable

some solution from SO didnt help much..doing exactly but nothing do..same post as below Zend Framework 2:Argument 1 passed to Album\Controller\AlbumController::__construct() must be an instance of Album\Controller\AlbumTable

遇到这个错误

Argument 1 passed to Album\Controller\AlbumController::__construct() must be an instance of Album\Controller\AlbumTable, instance of Album\Model\AlbumTable given, called in C:\xampp\htdocs\zendF\module\Album\src\Module.php on line 43

堆栈跟踪

#0 C:\xampp\htdocs\zendF\module\Album\src\Module.php(43): Album\Controller\AlbumController->__construct(Object(Album\Model\AlbumTable))
#1 C:\xampp\htdocs\zendF\vendor\zendframework\zend-servicemanager\src\ServiceManager.php(758): Album\Module->Album\{closure}(Object(Zend\ServiceManager\ServiceManager), 'Album\\Controlle...', NULL)
#2 C:\xampp\htdocs\zendF\vendor\zendframework\zend-servicemanager\src\ServiceManager.php(200): Zend\ServiceManager\ServiceManager->doCreate('Album\\Controlle...')
#3 C:\xampp\htdocs\zendF\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php(141): Zend\ServiceManager\ServiceManager->get('Album\\Controlle...')
#4 C:\xampp\htdocs\zendF\vendor\zendframework\zend-mvc\src\DispatchListener.php(95): Zend\ServiceManager\AbstractPluginManager->get('Album\\Controlle...')
#5 C:\xampp\htdocs\zendF\vendor\zendframework\zend-eventmanager\src\EventManager.php(322): Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
#6 C:\xampp\htdocs\zendF\vendor\zendframework\zend-eventmanager\src\EventManager.php(179): Zend\EventManager\EventManager->triggerListeners(Object(Zend\Mvc\MvcEvent), Object(Closure))
#7 C:\xampp\htdocs\zendF\vendor\zendframework\zend-mvc\src\Application.php(332): Zend\EventManager\EventManager->triggerEventUntil(Object(Closure), Object(Zend\Mvc\MvcEvent))
#8 C:\xampp\htdocs\zendF\public\index.php(40): Zend\Mvc\Application->run()
#9 {main}

我的 Module.php

my Module.php

<?php
namespace Album;


use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements ConfigProviderInterface
{

    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }


    public function getServiceConfig()
    {
        return [
            'factories' => [
                Model\AlbumTable::class => function($container) {
                    $tableGateway = $container->get(Model\AlbumTableGateway::class);
                    return new Model\AlbumTable($tableGateway);
                },
                Model\AlbumTableGateway::class => function ($container) {
                    $dbAdapter = $container->get(AdapterInterface::class);
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ],
        ];
    }

    public function getControllerConfig()
    {
        return [
            'factories' => [
                Controller\AlbumController::class => function($container) {
                    return new Controller\AlbumController(
                        $container->get(Model\AlbumTable::class)
                    );
                },
            ],
        ];
    }
}
?>

我的相册控制器.php

my AlbumController.php

<?php
    namespace Album\Controller;

    use Zend\Mvc\Controller\AbstractActionController;



    class AlbumController extends AbstractActionController
    {

        private $table;

        public function __construct(AlbumTable $table)
        {
            $this->table = $table;
        }


        public function indexAction() {
            return new ViewModel([
                'albums' => $this->table->fetchAll(),
            ]);
        }

        public function addAction() {
        }

        public function editAction() {
        }

        public function deleteAction() {
        }
    }
?>

我的 Module.config.php

my Module.config.php

<?php
    namespace Album;

    use Zend\Router\Http\Segment;

    return [

        'router' => [
            'routes' => [
                'album' => [

                    'type'    => Segment::class,
                    'options' => [

                        'route' => '/album[/:action[/:id]]',
                        'constraints' => [
                            'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'id'     => '[0-9]+',
                        ],
                        'defaults' => [
                            'controller' => Controller\AlbumController::class,
                            'action'     => 'index',
                        ],
                    ],
                ],
            ],
        ],

        'view_manager' => [
            'template_path_stack' => [
                'album' => __DIR__ . '/../view',
            ],
        ],
    ];
?>

推荐答案

你应该把依赖放在命名空间之后.
试试这个:

You should put the dependency after namespace.
Try this:

<?php

    namespace Album\Controller;

    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;
    use Album\Model\AlbumTable;

    class AlbumController extends AbstractActionController
    {

        private $table;

        public function __construct(AlbumTable $table)
        {
            $this->table = $table;
        }

        public function indexAction() {
            return new ViewModel([
                'albums' => $this->table->fetchAll(),
            ]);
        }

        public function addAction() {
        }

        public function editAction() {
        }

        public function deleteAction() {
        }
    }

这篇关于传递给 Controller\foo 的参数 1 必须是 Controller\foo 的实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆