PHP + Form(html)
У меня есть класс контроллер в котором находится метод для создания новой записи в БД. Как в html form указать чтобы вызывать именно конкретный метод который нужно в action через метод post, а не только указание файла.
<form action="Controller.php" id="form" method="post">
<div class="task">
<div class="pathtask">
<div class="photoprofile"><img src="files/profile.png" alt=""><br>Guest</div>
<div class="info">
<div class="poloca"> <input type="text" placeholder="Name" class="formpath" name="Name" id="Name"></div>
<div class="poloca"><input type="email" placeholder="Email" class="formpath" name="email" id="email"></div>
</div>
</div>
<div class="texttask">
<div contenteditable="true" class="textarea" align="left" name="text" id="texts">
Введите текст..
</div>
<input type="submit" class="knopka">
</div>
</div>
</form>
controller.php
<?php
require_once ('Task.php');
class Taskcontroller extends Task{
public function GetTask(){
$tasks=$this->list();
$view=ShowTasks::getInstance();
$view->PrintAllTask($tasks);
}
public function CreateTask(){
$this->name=$_POST['name'];
$this->email=$_POST['email'];
$this->text=$_POST['text'];
var_dump($this->name);
}
}
index.php
Ответы (1 шт):
Автор решения: Егор Банин
→ Ссылка
Чтобы сопоставить url и метод класса-контроллера вам необходим роутер. Если вы используете какой-то готовый фрэймворк, то роутер там уже есть, если пишете что-то своё, то вам надо реализовать роутер.
Вот очень упрощённый пример кода, надеюсь это подтолкнёт вас в правильном направлении.
<?php // index.php
// php -S localhost:8000
$requestMethod = $_SERVER['REQUEST_METHOD']?? 'UNKNOWN';
$requestUrl = $_SERVER['REQUEST_URI']?? '';
$requestPath = parse_url($requestUrl, PHP_URL_PATH);
$router = new Router([
'GET /' => 'IndexController::index',
'POST /tasks' => 'Taskcontroller::CreateTask',
]);
try {
$func = $router->route("$requestMethod $requestPath");
} catch (Exception $e) {
echo 'Что-то пошло не так: ' . $e->getMessage();die;
}
$func();
// -------------------
class Router
{
private $routes;
public function __construct(array $routes)
{
$this->routes = $routes;
}
public function route(string $requestId): callable
{
$func = null;
foreach ($this->routes as $requestPattern => $controllerMethodName) {
if ($requestPattern === $requestId) {
[$controllerName, $methodName] = explode('::', $controllerMethodName);
try {
$controller = new $controllerName();
} catch (Throwable $t) {
throw new Exception("404 не удалось инстанцировать класс контроллера $controllerName", 1, $t);
}
$func = [$controller, $methodName];
break;
}
}
if ( ! $func) {
throw new Exception("404 не найден подходящий маршрут", 1);
}
return $func;
}
}
class IndexController
{
public function index()
{
echo '
Index page<br>
<form action="/tasks" method="post">
<input type="text" name="foo">
<button type="submit">Отправить</button>
</form>
';
}
}
class Taskcontroller
{
public function CreateTask()
{
var_dump($_POST);
}
}