Маршрутизация для нескольких хостов в Cakephp - PullRequest
0 голосов
/ 09 января 2020

Как говорит поваренная книга:

Маршруты могут использовать опцию _host, чтобы соответствовать только указанным c хостам. Вы можете использовать *. Подстановочный знак для соответствия любому поддомену.

Но что, если я хотел бы установить один и тот же маршрут для нескольких хостов одновременно?

Например:

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHost('images.example.com');

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHost('images.example2.com');

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHost('images.example3.com');

Выше указано бессмысленно, если мне придется установить несколько десятков таких маршрутов.

В идеале это будет примерно так:

$routes->connect(
    '/images',        
    ['controller' => 'Images', 'action' => 'index']
)->setHosts(['images.example.com','images.example2.com','images.example3.com']);

1 Ответ

2 голосов
/ 09 января 2020

Это не поддерживается, вам придется либо задать несколько маршрутов соответственно, что вы можете просто сделать в oop, когда вы вводите список своих хостов:

foreach (['images.example.com','images.example2.com','images.example3.com'] as $host) {
    $routes
        ->connect(
            '/images',        
            ['controller' => 'Images', 'action' => 'index']
        )
        ->setHost($host);
}

или создать свой собственный Класс маршрута, который принимает либо несколько хостов, либо, возможно, фактические регулярные выражения. Последнее, вероятно, было бы проще, поскольку не требовало бы переопределения большого количества материала для сопоставления, например:

src / Routing / Route / RegexHostRoute. php

namespace App\Routing\Route;

use Cake\Routing\Route\DashedRoute;

class RegexHostRoute extends DashedRoute
{
    public function match(array $url, array $context = []): ?string
    {
        // avoids trying to match the _host option against itself in parent::match()
        if (!isset($url['_host'])) {
            return null;
        }

        return parent::match($url, $context);
    }

    public function hostMatches(string $host): bool
    {
        return preg_match('^@' . $this->options['_host'] . '@$', $host) === 1;
    }
}

Это должно позволить установить хост как images\.example[2-3]?\.com:

$routes
    ->connect(
        '/images',        
        ['controller' => 'Images', 'action' => 'index'],
        ['routeClass' => \App\Routing\Route\RegexHostRoute::class]
    )
    ->setHost('images\.example[2-3]?\.com');

См. Также

...