首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从“深度”教程获取路由时的"ServiceNotFoundException“

从“深度”教程获取路由时的"ServiceNotFoundException“
EN

Stack Overflow用户
提问于 2016-12-30 14:07:30
回答 1查看 622关注 0票数 0

我已经完成了所有ZendFramework2教程在“路由”中的停留,完全是这样的:https://docs.zendframework.com/tutorials/in-depth-guide/understanding-routing/

我的问题是,我已经按照建议在代码中完成了所有内容,但是当我尝试本地http://localhost:8080/blog中的路由(在运行php -S 0.0.0.0:8080 -t public public/index.php后可以访问)时,我遇到了这个错误:

致命错误:在插件管理器Zend\ 'Zend\ServiceManager\Exception\ServiceNotFoundException‘\RoutePluginManager’中找不到带有消息‘名为"Blog\Segment“的未命名的异常C:_PROJETOS\Knowledge\ZendFramework2\5-InDepth\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php:131:#0 C:_PROJETOS\Knowledge\ZendFramework2\5-InDepth\vendor\zendframework\zend-router\src\SimpleRouteStack.php(280):Zend\ServiceManager\AbstractPluginManager->get('Blog\Segment',数组) #1 C:_PROJETOS\Knowledge\ZendFramework2\5-InDepth\vendor\zendframework\zend-router\src\Http\TreeRouteStack.php(201):Zend\Router\SimpleRouteStack->routeFromArray(Array) #2 C:_PROJETOS\Knowledge\ZendFramework2\5-InDepth\vendor\zendframework\zend-router\src\Http\TreeRouteStack.php(151):Zend\Router\Http\TreeRouteStack->routeFromArray(Array) #3 C:_PROJETOS\Knowledge\ZendFramework2\5-InDepth\vendor\zendframework\zend-router\src\Zend\Router\Http\TreeRouteStack->addRoute('deta (142):C:_PROJETOS\Knowledge\ZendFramework2\5-InDepth\vendor\zendframework\zend-servicemanager\src\AbstractPluginManager.php中的SimpleRouteStack.php在第131行

我看不出会发生什么来解决这个问题,很长一段时间我都没有用Zend 2编写代码。

我非常感谢在理解和解决它方面的任何帮助!

我的模块名为"Blog“,在其中,这些是我的文件:

module.config.php

代码语言:javascript
复制
<?php
namespace Blog;

use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;

return [
    'service_manager' => [
        'aliases' => [
            //Model\PostRepositoryInterface::class => Model\PostRepository::class
            Model\PostRepositoryInterface::class => Model\ZendDbSqlRepository::class,
        ],
        'factories' => [
            Model\PostRepository::class => InvokableFactory::class,
            Model\ZendDbSqlRepository::class => Factory\ZendDbSqlRepositoryFactory::class,
        ],
    ],
    'controllers' => [
        'factories' => [
            Controller\ListController::class => Factory\ListControllerFactory::class,
        ],
    ],
    'router' => [
        'routes' => [
            'blog' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/blog',
                    'defaults' => [
                        'controller' => Controller\ListController::class,
                        'action'     => 'index',
                    ],
                ],
                'may_terminate' => true,
                'child_routes'  => [
                    'detail' => [
                        'type' => Segment::class,
                        'options' => [
                            'route'    => '/:id',
                            'defaults' => [
                                'action' => 'detail',
                            ],
                            'constraints' => [
                                'id' => '[1-9]\d*',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
    'view_manager' => [
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

ListController.php

代码语言:javascript
复制
<?php
namespace Blog\Controller;

use Blog\Model\PostRepositoryInterface;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use InvalidArgumentException;

class ListController extends AbstractActionController
{
    /**
     * @var PostRepositoryInterface
     */
    private $postRepository;

    public function __construct(PostRepositoryInterface $postRepository)
    {
        $this->postRepository = $postRepository;
    }

    public function indexAction()
    {
        return new ViewModel([
            'posts' => $this->postRepository->findAllPosts(),
        ]);
    }

    public function detailAction()
    {
        $id = $this->params()->fromRoute('id');

        try {
            $post = $this->postRepository->findPost($id);
        } catch (\InvalidArgumentException $ex) {
            return $this->redirect()->toRoute('blog');
        }

        return new ViewModel([
            'post' => $post,
        ]);
    }
}

ZendDbSqlRepository.php

代码语言:javascript
复制
<?php
namespace Blog\Model;

use InvalidArgumentException;
use RuntimeException;
use Zend\Hydrator\HydratorInterface;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\Adapter\Driver\ResultInterface;
use Zend\Db\ResultSet\HydratingResultSet;
use Zend\Db\Sql\Sql;

class ZendDbSqlRepository implements PostRepositoryInterface
{
    /**
     * @var AdapterInterface
     */
    private $db;

    /**
     * @var HydratorInterface
     */
    private $hydrator;

    /**
     * @var Post
     */
    private $postPrototype;

    public function __construct(
        AdapterInterface $db,
        HydratorInterface $hydrator,
        Post $postPrototype
    ) {
        $this->db            = $db;
        $this->hydrator      = $hydrator;
        $this->postPrototype = $postPrototype;
    }

    /**
    * Return a set of all blog posts that we can iterate over.
    *
    * Each entry should be a Post instance.
    *
    * @return Post[]
    */
    public function findAllPosts()
    {
        $sql       = new Sql($this->db);
        $select    = $sql->select('posts');
        $statement = $sql->prepareStatementForSqlObject($select);
        $result    = $statement->execute();

        if (! $result instanceof ResultInterface || ! $result->isQueryResult()) {
            return [];
        }

        $resultSet = new HydratingResultSet($this->hydrator, $this->postPrototype);
        $resultSet->initialize($result);
        return $resultSet;
    }

    /**
     * {@inheritDoc}
     * @throws InvalidArgumentException
     * @throws RuntimeException
     */
    public function findPost($id)
    {
        $sql       = new Sql($this->db);
        $select    = $sql->select('posts');
        $select->where(['id = ?' => $id]);

        $statement = $sql->prepareStatementForSqlObject($select);
        $result    = $statement->execute();

        if (! $result instanceof ResultInterface || ! $result->isQueryResult()) {
            throw new RuntimeException(sprintf(
                'Failed retrieving blog post with identifier "%s"; unknown database error.',
                $id
            ));
        }

        $resultSet = new HydratingResultSet($this->hydrator, $this->postPrototype);
        $resultSet->initialize($result);
        $post = $resultSet->current();

        if (! $post) {
            throw new InvalidArgumentException(sprintf(
                'Blog post with identifier "%s" not found.',
                $id
            ));
        }

        return $post;
    }
}

ZendDbSqlRepositoryFactory.php

代码语言:javascript
复制
<?php
namespace Blog\Factory;

use Interop\Container\ContainerInterface;
use Blog\Model\Post;
use Blog\Model\ZendDbSqlRepository;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Hydrator\Reflection as ReflectionHydrator;
use Zend\ServiceManager\Factory\FactoryInterface;

class ZendDbSqlRepositoryFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        return new ZendDbSqlRepository(
            $container->get(AdapterInterface::class),
            new ReflectionHydrator(),
            new Post('', '')
        );
    }
}

PostRepositoryInterface.php

代码语言:javascript
复制
<?php
namespace Blog\Model;

interface PostRepositoryInterface
{
    /**
     * Return a set of all blog posts that we can iterate over.
     *
     * Each entry should be a Post instance.
     *
     * @return Post[]
     */
    public function findAllPosts();

    /**
     * Return a single blog post.
     *
     * @param  int $id Identifier of the post to return.
     * @return Post
     */
    public function findPost($id);
}

Post.php

代码语言:javascript
复制
<?php
namespace Blog\Model;

class Post
{
    /**
     * @var int
     */
    private $id;

    /**
     * @var string
     */
    private $text;

    /**
     * @var string
     */
    private $title;

    /**
     * @param string $title
     * @param string $text
     * @param int|null $id
     */
    public function __construct($title, $text, $id = null)
    {
        $this->title = $title;
        $this->text = $text;
        $this->id = $id;
    }

    /**
     * @return int|null
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getText()
    {
        return $this->text;
    }

    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }
}

index.phtml

代码语言:javascript
复制
<h1>Blog</h1>

<?php foreach ($this->posts as $post): ?>
    <article>
        <h1 id="post<?= $post->getId() ?>"><?= $post->getTitle() ?></h1>

        <p><?= $post->getText() ?></p>
    </article>
<?php endforeach ?>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-30 14:25:44

在您的module.config.php中--缺少以下名称空间:

代码语言:javascript
复制
use Zend\Router\Http\Segment;

这就是为什么它试图查找Blog\Segment,因为您忘记为Segment::class使用正确的命名空间,从而在当前命名空间中查找类。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41397577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档