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

PHP - Walidacja danych wejściowych

0 głosów
78 wizyt
pytanie zadane 7 maja w PHP, Symfony, Zend przez Luna Cognita Dyskutant (8,030 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 przez JuniorPL Początkujący (390 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 przez Luna Cognita Dyskutant (8,030 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 przez JuniorPL Początkujący (390 p.)
Zgadza się, ale za pomocą modelu komunikujesz się z poziomu kontrolera do widoku.
komentarz 7 maja przez Luna Cognita Dyskutant (8,030 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 przez JuniorPL Początkujący (390 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 przez Assasz Nałogowiec (29,090 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 przez Luna Cognita Dyskutant (8,030 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 przez Assasz Nałogowiec (29,090 p.)
edycja 8 maja 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ź 128 wizyt
pytanie zadane 15 maja 2018 w C i C++ przez qlucha Obywatel (1,820 p.)
0 głosów
1 odpowiedź 87 wizyt
pytanie zadane 18 sierpnia 2016 w C i C++ przez navivix Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 60 wizyt
pytanie zadane 11 listopada 2018 w C i C++ przez jankowa1ski Gaduła (3,560 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

65,654 zapytań

112,282 odpowiedzi

236,928 komentarzy

46,645 pasjonatów

Przeglądających: 161
Pasjonatów: 1 Gości: 160

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...