Slim 3 несколько маршрутов к одной функции?

Я искал во всем Интернете и не могу найти ничего, что говорило бы вам, как назначить несколько маршрутов для одного обратного вызова. Например, я хочу переместить:

$app->get('/sign-in', function($request, $response) {
    return $this->view->render($response, 'home.twig');
});

$app->get('/login', function($request, $response) {
    return $this->view->render($response, 'home.twig');
});

во что-то вроде:

$app->get(['/sign-in', '/login'], function($request, $response) {
    return $this->view->render($response, 'home.twig');
});

Есть ли способ сделать это с Slim 3? Я нашел в Интернете, что в Slim 2 вы можете использовать функцию conditions([]); в конце, чтобы связать несколько маршрутов с одним обратным вызовом.


person Joe Scotto    schedule 28.03.2017    source источник
comment
Поскольку вы уже используете структуру, подобную MVC, рассматривали ли вы возможность использования контроллера вместо непосредственного включения замыканий в файл маршрутов?   -  person Bytewave    schedule 28.03.2017
comment
@Bytewave Я новичок во всем этом типе структуры, не могли бы вы объяснить немного подробнее, что вы имеете в виду? Может быть, привести пример кода? Спасибо!   -  person Joe Scotto    schedule 28.03.2017
comment
Контроллеры немного сложно объяснить в комментарии, но я попробую ответить.   -  person Bytewave    schedule 28.03.2017
comment
@Bytewave Спасибо, я очень ценю это!   -  person Joe Scotto    schedule 28.03.2017
comment
На самом деле, просматривая ваши комментарии к другому ответу, я не уверен, что так нужно поступать. В любом случае я бы рекомендовал использовать контроллеры, чтобы разделить вашу логику и помочь вам организоваться, но это может быть неуместно. Я не уверен, что есть способ сделать это с помощью всего лишь массива путей маршрута --- кажется, вам придется делать это с помощью повторяющихся вызовов ->get().   -  person Bytewave    schedule 28.03.2017
comment
Способ, описанный Стивом, может работать, он не самый чистый, но определенно упрощает изменение всего кода сразу.   -  person Joe Scotto    schedule 28.03.2017
comment
Боюсь, это самое чистое, что может быть. Хотя, опять же, обратите внимание на контроллеры, если хотите, чтобы ваша логика была чистой и отдельной. У Codecourse есть руководство по контроллерам Slim 3, но, похоже, у вас есть иметь учетную запись для просмотра всей серии, и я забыл, платный ли доступ к CC.   -  person Bytewave    schedule 28.03.2017


Ответы (4)


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

$routes = [
    '/',
    '/home', 
    '/sign-in',
    '/login',
    '/register',
    '/sign-up',
    '/contact'
];

foreach ($routes as $route) {
    $app->get($route, function($request, $response) {
        return $this->view->render($response, 'home.twig');
    });
}
person Joe Scotto    schedule 28.03.2017
comment
Это, безусловно, сработает, так что +1. Хотя лично я нахожу это менее интуитивным, чем явные маршруты с общей функцией/методом. - person Steve; 28.03.2017
comment
@ Стив, да. Я вижу преимущества обоих методов. Я предпочитаю тот, который я нашел, потому что с моим приложением я могу просто добавить новый маршрут в массив, и это будет сделано, вместо того, чтобы создавать еще один get. - person Joe Scotto; 28.03.2017

Просто создайте функцию как замыкание и передайте ее как параметр:

$home = function($request, $response) {
    return $this->view->render($response, 'home.twig');
};

$app->get('/sign-in', $home);

$app->get('/login',   $home);

Или используйте именованную функцию:

function home($request, $response) {
    return $this->view->render($response, 'home.twig');
};
$app->get('/sign-in', 'home');

$app->get('/login',   'home');
person Steve    schedule 28.03.2017
comment
Это может очень легко сработать, но я бы предпочел способ, при котором я мог бы просто передать массив маршрутов в $app->get(). Это вообще возможно? - person Joe Scotto; 28.03.2017
comment
Не частый пользователь Slim, поэтому я могу указать только здесь: stackoverflow.com/questions/11521264/, но лично я предпочитаю иметь явные маршруты, даже если они совместно используют обратный вызов (или действительно метод контроллера, как было предложено от @Bytewave ) - person Steve; 28.03.2017
comment
К вашему сведению @Steve, этот вопрос/ответ относится к Slim 2 и, к сожалению, больше не актуален. - person Bytewave; 28.03.2017
comment
@Bytewave да, это всегда проблема при ответе без текущих знаний фреймворка. Надеюсь, кто-то еще может предложить альтернативу, хотя я предпочитаю явные маршруты, независимо от фреймворка или языка программирования. - person Steve; 28.03.2017

FastRoute не делает то, что вам нужно, однако вы можете использовать параметр, который ограничен регулярным выражением для список URL-адресов, которые вы хотите использовать:

$app->get("/{_:sign-in|login}", function ($request, $response) {
    $response->write("Hello!");
    return $response;
});

Обратите внимание, что у вас должно быть имя аргумента, поэтому я использовал _, так как это безобидно.

person Rob Allen    schedule 29.03.2017

Я использую регулярное выражение, чтобы сделать этот трюк:

$app->get('/{router:login|sign-in}', function ($request, $response, $args) {
  echo "Hello, " . $args['router'];
});
person Jiyu    schedule 07.12.2017