• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PHP - Walidacja danych wejściowych

VPS Starter Arubacloud
0 głosów
550 wizyt
pytanie zadane 7 maja 2019 w PHP przez Luna Cognita Dyskutant (8,130 p.)
Witam,

Mam pytanie odnośnie wzorca MVC, walidacja danych wejściowych w tym przypadku dodanie newsa na stronę lub rejestracja użytkownika powinna znajdować się w kontrolerze czy w modelu?

Pozdrawiam

2 odpowiedzi

0 głosów
odpowiedź 7 maja 2019 przez JuniorPL Użytkownik (770 p.)
Warstwa modelu odpowiedzialna jest za połączeni widoku z kontrolerem(w uproszczeniu). Pobrane dane trafaiją do kontrolera tam wykonywane są na nich operacje i poprzez model zwracane do widoku.
komentarz 7 maja 2019 przez Luna Cognita Dyskutant (8,130 p.)
No nie właśnie, to kontroller obsługuje wejście i odpowiednio zarządza modelem i widokiem na podstawie obsługi żądania
komentarz 7 maja 2019 przez JuniorPL Użytkownik (770 p.)
Zgadza się, ale za pomocą modelu komunikujesz się z poziomu kontrolera do widoku.
komentarz 7 maja 2019 przez Luna Cognita Dyskutant (8,130 p.)
Jak z poziomu modelu wywołać kontroler wywołujący model? Pogmatwane to trosze mógłbyś jakiś przykład podać? Byłbym bardzo wdzięczny.

Pozdrawiam
komentarz 7 maja 2019 przez JuniorPL Użytkownik (770 p.)

W poziomie kontrolera dodaje do modelu theEmploy którego dane w widoku zostaną wyświetlone. Faktycznie nie jasno wyjaśniłem sprawę.

fragment kodu javy

@GetMapping("/showFormForUpdate")
	public String showFormForUpdate(@RequestParam("employeeId") int theId,Model theModel)
	{
		Employee theEmployee = employeeService.findById(theId);
		System.out.println(theEmployee.getPhotoName());
		employeeService.deletePhotoByName(theEmployee.getPhotoName());
		theModel.addAttribute("employee",theEmployee);
		
		return "employees/employee-form";
	}

 

0 głosów
odpowiedź 7 maja 2019 przez Assasz Nałogowiec (30,460 p.)
To zależy.

Walidacja ról biznesowych powinna mieć miejsce w modelu, walidacja żądania w kontrolerze. Czyli np. w kontrolerze sprawdzasz, czy hasło znajduje się w request body i jest stringiem, a w modelu sprawdzasz, czy ma odpowiednią długość, zawiera cyfry itp.
komentarz 7 maja 2019 przez Luna Cognita Dyskutant (8,130 p.)

Czyli takie coś jest jak najbardziej poprawne?

/src/Model/News.php

 

		public function insert($data){
			if(preg_match('@^[A-Za-z0-9 ]{5,40}$@', $data['title'])){
				if(preg_match('@^[A-Za-z0-9 ]{4,30}$@', $data['author'])){
					$query = $this->pdo->prepare('INSERT INTO news VALUES(NULL, :title, :date, :content, :author)');
					$query->bindValue(':title', $data['title'], \PDO::PARAM_STR);
					$query->bindValue(':date', time(), \PDO::PARAM_INT);
					$query->bindValue(':content', $data['content'], \PDO::PARAM_STR);
					$query->bindValue(':author', $data['author'], \PDO::PARAM_STR);
					$query->execute();
					return 'Success'; //niewiem jeszcze jak wyświetlać tekst ;/
				} else {
					return 'Author name have illegal characters!';  //niewiem jeszcze jak wyświetlać tekst ;/
				}
			} else {
				return 'Title is too long or have illegal characters!';  //niewiem jeszcze jak wyświetlać tekst ;/
			}
		}

 

src/Controller/News.php (niewiem czy dobry zapis stosuję)

		public function add(){
			$model = new \Ether\GloberaAcc\Model\News;
			$view = new \Ether\GloberaAcc\View\News;
			if (!empty($_POST)) {
				$add = $model->insert($_POST);
				$view->returned = $add;
				$view->loadTemplate('add-news', 'news/');
			} else {
				$view->loadTemplate('add-news', 'news/');
			}
		}

Moj index.php 

<?php

	use \Ether\GloberaAcc\Engine\Alert;
	use \Ether\GloberaAcc\Controller\News;

	$config = 'config.php';
	$autoloader = 'vendor/autoload.php';

	if(is_file($config)){
		require $config;
	} else {
		echo 'Cannot load configuration file: <b>'.$config.'</b>';
		exit();
	}
	
	if(is_file($autoloader)){
		require $autoloader;
	} else {
		echo 'Cannot load autoloader file: <b>'.$autoloader.'</b>';
		exit();
	}
	
	if(DISPLAY_ERRORS){
		ini_set('display_errors', 1);
		ini_set('display_startup_errors', 1);
		error_reporting(E_ALL);
	}
	
	if(SITE_ENABLED){
		$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r){
			$r->addRoute(['GET', 'POST'], '/add-news', 'News/add');
		});

		// Fetch method and URI from somewhere
		$httpMethod = $_SERVER['REQUEST_METHOD'];
		$uri = $_SERVER['REQUEST_URI'];

		// Strip query string (?foo=bar) and decode URI
		if(false !== $pos = strpos($uri, '?')){
			$uri = substr($uri, 0, $pos);
		}
		$uri = rawurldecode($uri);

		$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
		switch($routeInfo[0]){
			case FastRoute\Dispatcher::NOT_FOUND:
				$news = new News;
				$news->index();
				break;
			case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
				$allowedMethods = $routeInfo[1];
				echo 'error 405';
				break;
			case FastRoute\Dispatcher::FOUND:
				$handler = $routeInfo[1];
				$vars = $routeInfo[2];
				list($class, $method) = explode('/', $handler, 2);
				$tmp = '\Ether\GloberaAcc\Controller\\'.$class; //to też jest troszę partyzantka ale jak daję przedstrzeń nazw po new to dostaję error
				call_user_func_array(array(new $tmp, $method), $vars);
				break;
		}
	} else {
		Alert::showAlert('Site disabled!', Alert::Danger);
	}

 

/public/templates/news/add-news.html.php

<?php $this->getHeader(); ?>

<?php echo isset($this->returned) ? $this->returned : NULL; ?> //niewiem jak wyśwetlać wiadomość zwrotną że news zostal dodany, czy tak jest ok?

<form action="/add-news" method="post">
title: <input type="text" name="title" value=""><br />
content: <input type="text" name="content" value="">
<input type="hidden" name="author" value="Bart" />
<input type="submit" value="submit">

</form>


<?php $this->getFooter(); ?>

 

komentarz 8 maja 2019 przez Assasz Nałogowiec (30,460 p.)
edycja 8 maja 2019 przez Assasz

W modelu odwołujesz się do $data['title'], ale nie wiesz, czy taka wartość istnieje. Po prostu sprawdasz, czy tabilca $_POST nie jest pusta - to trochę mało.

Mógłbyś też oddzielić walidację do innej warstwy, tak aby model nie wiedział nic na temat implementacji walidacji i w ten sposób był od niej niezależny (np. przez abstrakcję i odwrócenie zależności) - to zadanie z gwiazdką.

return 'Success'; //niewiem jeszcze jak wyświetlać tekst ;/

Możesz wsadzić to w DTO jeśli chcesz, ale tak też jest ok. Możesz też oddelegować to do walidacji...

$errors = $this->validator->validate($data);

if (count($errors) > 0) {
    return $errors;
}

return 'Success';

// z DTO

$errors = $this->validator->validate($data);

if (count($errors) > 0) {
    return $outputDto->setErrors($errors);
}

return $outputDto->setSucces();

Do wyświetlania takich komunikatów w widoku możesz użyć czegoś takiego jak flash messages, czyli sesji, która automatycznie wygasa po jej odczycie. Przykład w Symfony. 

Podobne pytania

0 głosów
1 odpowiedź 644 wizyt
pytanie zadane 15 maja 2018 w C i C++ przez qlucha Obywatel (1,790 p.)
0 głosów
1 odpowiedź 162 wizyt
pytanie zadane 18 sierpnia 2016 w C i C++ przez navivix Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 142 wizyt
pytanie zadane 11 listopada 2018 w C i C++ przez jankowa1ski Gaduła (3,560 p.)

92,452 zapytań

141,262 odpowiedzi

319,085 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...