Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Page Controller
Forum PHP.pl > Forum > PHP > Object-oriented programming
szubi95
Cześć!

Napisałem prosty Page Controller(jeśli można to tak nazwać) - namespace->class->method. Zastanawiam się nad parametrami metody przekazywanymi w url przy użyciu Reflection Api - mam na myśli akcje w postaci:

/user/show/{id_usera} - które trzeba skądś wziąć

Nie wiem, czy to aby mądre(bezpieczne), czy też nie można by zrobić tego inaczej - łatwiej.
Ogólnie rzecz biorąc proszę też o ocenę całości, jakąś podpowiedź, co mogę zmienić, dodać, czy też całość jest nie tak i naprowadzenie na jakąś inną koncepcję.

PageController:

  1. <?php
  2.  
  3. class PageController extends AbstractController
  4. {
  5. /**
  6.   * @var array
  7.   * @Description :
  8.   */
  9. private $path = [];
  10.  
  11. /**
  12.   * @var array
  13.   * @Description : store function class parameters if exist
  14.   */
  15. private $paramters = [];
  16.  
  17. /**
  18.   * @Constructor : PageController
  19.   * @param : $namespace
  20.   * @Description : collect the address path from @Class Request
  21.   * induction @Method init to create the path
  22.   */
  23. public function __construct($namespace)
  24. {
  25. $path = new Request();
  26. $this->init($path, $namespace);
  27. }
  28.  
  29. /**
  30.   * @Method : init
  31.   * @param Request : $address - initializes address path
  32.   * @param : $namespace - namespace of class which will be including
  33.   * @Description : create controller path and his action + params if exists
  34.   * induction @Method doIfExist for the action
  35.   */
  36. private function init(Request $address, $namespace)
  37. {
  38. $this->path = $address->getAll();
  39.  
  40. if (!empty($namespace)) {
  41. $namespace = filter_var($namespace, FILTER_SANITIZE_STRING);
  42. }
  43.  
  44. $controller = $namespace.$this->path[0];
  45. $controller = str_replace("/", "\\", $controller);
  46. !empty($this->path[1]) ? $action = $this->path[1] : $action = '';
  47.  
  48. $quantity = count($this->path);
  49.  
  50. if ($quantity > 2) {
  51. for ($i=2; $i<$quantity; $i++) {
  52. $this->paramters[] = $this->path[$i];
  53. }
  54. $this->doIfExist($controller, $action, $this->paramters);
  55. } else {
  56. $this->doIfExist($controller, $action);
  57. }
  58. }
  59.  
  60. /**
  61.   * @Method : doIfExist
  62.   * @param : $controller - class path with namespace
  63.   * @param : $action - class action
  64.   * @param : null $other - action parameters
  65.   * @Description : check that @Class $controller and his @Method $action are exist
  66.   * ...
  67.   */
  68. private function doIfExist($controller, $action, $other=null)
  69. {
  70. if (class_exists($controller) && method_exists($controller, $action)) {
  71. $controller = new $controller();
  72.  
  73. // Odzielić
  74. $reflection = new \ReflectionClass($controller);
  75. $method = $reflection->getMethod($action);
  76. $params = $method->getParameters();
  77.  
  78. //dodać ilość parametrów
  79. if (!empty($params) && !empty($other)) {
  80. $controller->$action($other);
  81. } else {
  82. $controller->$action();
  83. }
  84.  
  85. } else {
  86. self::error404();
  87. }
  88. }
  89. }
  90.  
  91. // uzycie
  92. new PageController('namespace/');
  93.  


Request:

  1. <?php
  2.  
  3. class Request
  4. {
  5. /**
  6.   * @const : string
  7.   * @Description : store default application path
  8.   */
  9. const DEFAULT_PATH = 'index';
  10.  
  11. /**
  12.   * @var : array
  13.   * @Description : store address elements from PATH_INFO
  14.   */
  15. private $feedback = [];
  16.  
  17. /**
  18.   * @Constructor : Request
  19.   * @Arguments : none
  20.   * @Description : induction @Method init
  21.   */
  22. public function __construct()
  23. {
  24. $this->init();
  25. }
  26.  
  27. /**
  28.   * @Method : init
  29.   * @Arguments : none
  30.   * @Description : Function which initialize address table @var $feedback
  31.   */
  32. private function init()
  33. {
  34. $path_info = trim($_SERVER['PATH_INFO'], '/');
  35. if (!empty($path_info)) {
  36. $this->feedback = explode('/',$path_info);
  37. $count = count($this->feedback);
  38.  
  39. for ($i=0; $i<$count; $i++) {
  40. $this->feedback[$i] = filter_var($this->feedback[$i], FILTER_SANITIZE_STRING);
  41. }
  42. } else {
  43. $this->setBasic();
  44. }
  45. }
  46.  
  47. /**
  48.   * @Method : setBasic
  49.   * @Arguments : none
  50.   * @Description : Function to set default path(class and method), if PATH_INFO does not exist
  51.   */
  52. private function setBasic()
  53. {
  54. if (empty($this->feedback[0]) && empty($this->feedback[1])) {
  55. $this->feedback[0] = static::DEFAULT_PATH;
  56. $this->feedback[1] = static::DEFAULT_PATH;
  57. }
  58. }
  59.  
  60. /**
  61.   * @Method : getAll
  62.   * @Arguments : none
  63.   * @Description : Function return address path @var $feedback
  64.   * @return array
  65.   */
  66. public function getAll()
  67. {
  68. return $this->feedback;
  69. }
  70. }



Pozdrawiam,
szubi

salfunglandyare
Koncepcja nie jest zła, ale o bezpieczeństwie będzie decydowało to, co chcesz osiągnąć. W przypadku takiego kontrolera warto obsłużyć wartość domyślną (/user/show), wartość błędną (/user/show/wrongId) itp. Co do bezpieczeństwa, niestety, ale musisz uważać. Newralgiczne elementy umieść poza routerem, umieść wszystkie dozwolone z zewnątrz obiekty w jakiejś zbiorczej przestrzeni nazw, kontroler niech z definicji odwołuje się tylko do tej przestrzeni (pamiętaj, że możesz tworzyć namespace w wielu poziomach, niech tu będzie np. '\\ForWeb\\'.$namespace wtedy z poziomu klas wywyoływanych z kontrolera będziesz miał dojście do klas 'niewidocznych' dla postronnych
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.