簡體   English   中英

Zend路由問題

[英]Zend routing issue

我正在將zend表達性網站(隨意組合)轉換為本地餐廳的zend framework 3網站。 當我在富有表現力的網站上設置路由時,我將根據如下所示的查詢參數加載位置。

website.com/location?location=xxx

在我的新網站上,路由如下所示

website.com/locations/view/xxx

我需要設置將舊網址重定向到新網址的路由。 到目前為止,我已經建立了一條尋找/ location?location = [/:location]的路由,希望它能夠識別出這條“ Segment”路由並加載適當的LocationsController。 現在,它給了我一條找不到路線的錯誤。

我的代碼如下所示。

module.config.php

namespace Application;

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

return [
    'router' => [
        'routes' => [
            'home' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'locations-old' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/location?location=[/:location]',
                    'defaults' => [
                        'controller' => Controller\LocationController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'locations' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/locations[/:action[/:location]]',
                    'constraints' => [
                        'action' => '[a-zA-Z]*',
                        'location'     => '[a-zA-Z]*',
                    ],
                    'defaults' => [
                        'controller' => Controller\LocationController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'locations.html' => [
                'type'    => Literal::class,
                'options' => [
                    'route'    => '/locations.html',
                    'constraints' => [
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'location'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                    ],
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'about' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/about',
                    'defaults' => [
                        'controller' => Controller\AboutController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'employ' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/employ',
                    'defaults' => [
                        'controller' => Controller\EmployController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'news' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/news',
                    'defaults' => [
                        'controller' => Controller\NewsController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
        ],
    ],
    'view_manager' => [
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => [
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ],
        'template_path_stack' => [
            __DIR__ . '/../view',
        ],
    ],
];

LocationController.php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Application\Model\StoreTable;
use Zend\View\Model\ViewModel;

class LocationController extends AbstractActionController
{
    private $table;

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

    public function indexAction()
    {
        if($_GET['location'] && $this->table->doesExist($_GET['location'])) {
            $location = $_GET['location'];
            $this->redirect()->toRoute('locations', ['action' => 'view', 'location' => $location])->setStatusCode(302);
        } else {
            $this->redirect()->toUrl('/#locations')->setStatusCode(301);
        }
    }

    public function viewAction()
    {
        $location = (string) $this->params()->fromRoute('location');

        $store = $this->table->getStore($location);

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

任何幫助將不勝感激,如果需要,我可以提供更多信息。 謝謝!

如下配置您的路線,這將是基於URL的處理,如您給定的“ website.com/location?location=xxx ”,

在下面的路徑中,“ :key ”變量表示?location=xxx

          'locations-old' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/location/:key',
                    'defaults' => [
                        'controller' => Controller\LocationController::class,
                        'action'     => 'index',
                    ],
                    'constraints' => [
                        'key' => '[a-z0-9]+',
                    ],
                ],
                'child_routes' => [
                    'query' => ['type' => 'query'],
                ],
            ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM