Так работает метод AltoRouter GET POST?

Я опробовал этот altorouter уже несколько недель. Похоже, это хороший роутер, где не так много рабочих примеров на сетях или на официальном сайте. Вам нужно как-то это понять и выполнить работу.

Я попробовал базовые методы GET и POST, используя altorouter, и не знаю, правильно ли это делать.

Простой метод GET в php

<html>
<head>
</head>
<body>
<form action="welcome.php" method="post">
    Name: <input type="text" name="name"><br>
    E-mail: <input type="text" name="email"><br>
    <input type="submit">
</form>
</body>
</html>

Как я это сделал с помощью AltoRouter

Index.php

<?php
require 'library/AltoRouter.php';
$router = new AltoRouter();
$router->setBasePath('/AltRouter');

$router->map('GET','/', function() {require __DIR__ . '/catalog/controller/home.php';}, 'home');
$router->map('GET|POST','/aboutus/', function() {require __DIR__ . '/catalog/controller/aboutus.php';}, 'aboutus');
$router->map('GET|POST','/contactus/', function() {require __DIR__ . '/catalog/controller/contactus.php';}, 'contactus');
$router->map('GET|POST','/welcome/', function() {require __DIR__ . '/catalog/controller/welcome.php';}, 'welcome');

$match = $router->match();

if( $match && is_callable( $match['target'] ) ) {
    call_user_func_array( $match['target'], $match['params'] ); 
} else {
    // no route matched
    header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
}

contactus.php (Получить метод)

<html>
<head>
</head>
<body>
<form action="../welcome/" method="post">
    Name: <input type="text" name="name"><br>
    E-mail: <input type="text" name="email"><br>
    <input type="submit">
</form>
</body>
</html>

welcome.php

Welcome <?php echo $_POST["name"]; ?><br>
Your email address is: <?php echo $_POST["email"]; ?>

По какой-то странной причине это работает, но я чувствую, что это неправильно. Причина: информация, отправленная методом GET, видна всем, переменные отображаются в URL, можно добавить страницу в закладки. Где находится URL, который я получаю после отправки формы, это

http://localhost/altrouter/contactus/

Переменная не отображается после отправки формы в URL.

Теперь для метода POST, этот работает, вам нужно сообщить мне, вот как мы должны это делать или нет.

Index.php

same as the one posted above

aboutus.php (используется метод POST)

<html>
<head>
</head>
<body>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
        $name = $_POST["first_name"];
        $email = $_POST["email_address"];

        echo "<h2>Your Input:</h2>";
        echo $name;
        echo "<br>";
        echo $email;
        echo "<br>";
}
?>

<form action="<?php $_SERVER["PHP_SELF"]?>" method="post">
    Name: <input type="text" name="first_name">
    <br><br>
    E-mail: <input type="text" name="email_address">
    <br><br>
    <input type="submit" name="submit" value="Submit">
</form>
</body>
</html>

Это работает, и опубликованные данные отражены, URL после отправки

http://localhost/altrouter/aboutus/

Пожалуйста, дайте мне знать, что правильно, а что нет.

1 ответ

Решение

Я не думаю, что я понимаю, что вы спрашиваете... У меня есть некоторые замечания, хотя:


Информация, отправленная методом GET, видна всем, переменные отображаются в URL

Да, это происходит в HTTP-методе GET, ?name=Joe&email=joe@example.com в конце URL-адреса называется "строка запроса". Одно из отличий метода POST заключается в том, что данные являются частью URL-адреса, поэтому они видимы (хотя не верьте, что они не видны иначе), и, как вы говорите, их можно добавить в закладки.


На GET vs POST прочитайте об использовании этих методов и определите один для каждого маршрута. Я не думаю, что это хороший дизайн, не говоря уже о том, что его легко обслуживать, иметь несколько методов, привязанных к одному контроллеру. Воспользуйтесь преимуществами роутера, сопоставьте различные методы, например:

$router->map('GET','/contactus', 'showContactForm');
$router->map('POST','/contactus', 'processContactForm');

Поскольку вы помечаете вопрос с помощью "MVC", вы можете разделить вещи дальше, и ваши контроллеры будут просто контроллерами, которые в свою очередь вызывают или генерируют представления. Или вы можете просто использовать полную инфраструктуру MVC, даже такую ​​легкую, как Lumen, которая управляет маршрутизацией, просмотром шаблонов, подключением к базе данных, аутентификацией и многим другим.


<form action="../welcome/" method="post">

От http://localhost/altrouter/contactus/ в http://localhost/altrouter/welcome/ относительный URL может быть просто welcome, .. означает "перейти в каталог".


URL, который я получаю после отправки формы, это

http://localhost/altrouter/contactus/

Я не понимаю, почему, если форма успешно отправлена, как вы говорите, вы должны быть в http://localhost/altrouter/welcome/


избежать $_SERVER["PHP_SELF"], Это приносит неуверенность. Форма без атрибута действия будет просто отправлена ​​на тот же URL. С помощью метода POST вы можете для одного и того же URL обрабатывать оба действия по отдельности, как я уже говорил ранее.

Другие вопросы по тегам