Я не понимаю Модули - PullRequest
       9

Я не понимаю Модули

0 голосов
/ 01 июня 2018

Я пытаюсь изучить Zend Framework 3, и я сделал учебник по Альбому и другой учебник по блогам.Я пишу прямые php-приложения около 3 лет и написал 2 веб-приложения, используя Slim 3. Я пытаюсь обернуть голову вокруг модулей.Я не совсем понимаю, что такое модуль.Я понял, что модули - это то, что модуль был крошечным приложением внутри основного приложения.Я пытался создать 2 контроллера в одном модуле и визуализировать различные представления из этих контроллеров.Я искал весь день и не смог найти способ создания двух контроллеров и их маршрутизации к различным представлениям.Но я нашел много примеров приложения, имеющего 5 разных модулей, все с одним контроллером и, возможно, разные представления, на которые указывает метод класса.Насколько я понимаю, что модуль должен быть создан для каждой страницы?Например, модуль входа в систему, модуль about и модуль контактов?

module.config.php

    <?php

namespace Blog;

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


return [
    // this line opens the configuration fro the Route Manager
    'router' => [
        // open configuration for all possible routes
        'routes' => [
            // Define a new route called 'blog'
            'blog' => [
                // define 'literal' route type:
                'type' => Literal::class,
                // configure the route itself
                'options' => [
                    // listen to '/blog' as uri:
                    'route' => '/blog',
                    // define default controller and action to be called when
                    // this route is matched
                    'defaults' => [
                        'controller' => Controller\ListController::class,
                        'action' => 'index',
                    ],
                    'login' => [
                        'type' => Literal::class,
                        'options' => [
                            'route' => '/blog/login',
                            'defaults' => [
                                'controller' => Controller\LoginController::class,
                                'action' => 'login',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
    'service_manager' => [
        'aliases' => [
            Model\PostRepositoryInterface::class => Model\PostRepository::class,
        ],
        'factories' => [
            Model\PostRepository::class => InvokableFactory::class,
        ],
    ],
    'controllers' => [
        'factories' => [
            Controller\ListController::class => Factory\ListControllerFactory::class,
            Controller\LoginController::class => InvokableFactory::class,
        ],
    ],
    'view_manager' => [
        'template_map' => [
            'login/login' => __DIR__ . '/../view/blog/login/login.phtml'
        ],
        'template_path_stack' => [
            __DIR__ . '/../view'
        ],
    ]
]; 

структура файла

 |-- module
        |   |-- Application
        |   |   |-- config
        |   |   |   |-- module.config.php
        |   |   |-- src
        |   |   |   |-- Module.php
        |   |   |   |-- Controller
        |   |   |       |-- IndexController.php
        |   |   |-- test
        |   |   |   |-- Controller
        |   |   |       |-- IndexControllerTest.php
        |   |   |-- view
        |   |       |-- application
        |   |       |   |-- index
        |   |       |       |-- index.phtml
        |   |       |-- error
        |   |       |   |-- 404.phtml
        |   |       |   |-- index.phtml
        |   |       |-- layout
        |   |           |-- layout.phtml
        |   |-- Blog
        |       |-- config
        |       |   |-- module.config.php
        |       |-- src
        |       |   |-- Module.php
        |       |   |-- Controller
        |       |   |   |-- ListController.php
        |       |   |   |-- LoginController.php
        |       |   |-- Factory
        |       |   |   |-- ListControllerFactory.php
        |       |   |-- Model
        |       |       |-- Post.php
        |       |       |-- PostCommandInterface.php
        |       |       |-- PostRepository.php
        |       |       |-- PostRepositoryInterface.php
        |       |-- view
        |           |-- blog
        |               |-- list
        |               |   |-- index.phtml
        |               |-- login
        |                   |-- login.phtml

Я работаюв модуле блога.Когда я вызываю LoginController.php, я хочу, чтобы он показывал login.phtml.Если я закомментирую маршрут блога, он будет работать, но когда я раскомментирую маршрут блога, я получу «Запрошенный URL не может быть сопоставлен путем маршрутизации».ошибка.

1 Ответ

0 голосов
/ 01 июня 2018

Маршрутизация не связана с отображаемым шаблоном, поэтому похоже, что у вас действительно есть проблема с маршрутизацией.

Ваша конфигурация маршрутизации не структурирована правильно.Это должно выглядеть примерно так:

return [
    // this line opens the configuration for the Route Manager
    'router' => [
        // open configuration for all possible routes
        'routes' => [
            // Define a new route called 'blog'
            'blog' => [
                // define 'literal' route type:
                'type' => Literal::class,
                // configure the route itself
                'options' => [
                    // listen to '/blog' as uri:
                    'route' => '/blog',
                    // define default controller and action to be called when
                    // this route is matched
                    'defaults' => [
                        'controller' => Controller\ListController::class,
                        'action' => 'index',
                    ],
                ],
                'may_terminate' => true,
                'child_routes' => [                
                    'login' => [
                        'type' => Literal::class,
                        'options' => [
                            'route' => '/login',
                            'defaults' => [
                                'controller' => Controller\LoginController::class,
                                'action' => 'login',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],

Различия:

  • Маршрут 'login' должен быть дочерним маршрутом, а не частью параметров маршрута blog.
  • Я добавил 'may_terminate' => true, что делает маршрут /blog работающим (маршруты с дочерними маршрутами по умолчанию недоступны)
  • Я изменил 'route' => '/blog/login', на 'route' => '/login', в маршруте входа в систему.Поскольку он является потомком блога, вам не нужно повторять путь к блогу.

Редактировать: если вы хотите использовать оба маршрута на верхнем уровне:

return [
    // this line opens the configuration for the Route Manager
    'router' => [
        // open configuration for all possible routes
        'routes' => [
            // Define a new route called 'blog'
            'blog' => [
                // define 'literal' route type:
                'type' => Literal::class,
                // configure the route itself
                'options' => [
                    // listen to '/blog' as uri:
                    'route' => '/blog',
                    // define default controller and action to be called when
                    // this route is matched
                    'defaults' => [
                        'controller' => Controller\ListController::class,
                        'action' => 'index',
                    ],
                ],
            ],
            'login' => [
                'type' => Literal::class,
                'options' => [
                    'route' => '/login',
                    'defaults' => [
                        'controller' => Controller\LoginController::class,
                        'action' => 'login',
                    ],
                ],
            ],                
        ],
    ],

Это добавляет маршруты для /blog и /login.Если вы хотите, чтобы страница входа была на /blog/login, вам нужно соответствующим образом отредактировать путь в маршруте входа.

...