Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Routing we wlasnym MVC
brzoza91
post
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 4
Dołączył: 9.05.2012

Ostrzeżenie: (0%)
-----


Witam
Chciałbym stworzyć routing, do własnej implementacji MVC. Na początku przedstawię strukturę katalogów mojego projektu.
(IMG:http://img855.imageshack.us/img855/6812/struktura.gif)
W folderze app, będą pliki danego projektu. Każdy contoller będzie miał swój plik .yml w którym będą zapisane zasady routingu.

przykładowy plik index.yml
prefiks oznacza wpisany adres url, contoller i action wiadomo.

  1. index:
  2. prefix: /index/index/
  3. controller: Index
  4. action: index
  5.  
  6. show:
  7. prefix: /index/show/
  8. controller: Index
  9. action: show
  10.  
  11. add:
  12. prefix: /index/add/
  13. controller: Index
  14. action: add


i tak działa mój routing:
1. ktoś wpisuje adres na mojej stronie np. index/show/40
2. sprawdzane jest czy istnieje dany controller o nazwie index, akcja show i parametr 40
3. jesli tak to uruchamiany jest odpowiednia akcja z contollera

Routing.php
  1. class Routing
  2. {
  3. private $action;
  4. private $controller;
  5. private $parameter;
  6. private $routingFile;
  7. private $path=array();
  8.  
  9. function __construct()
  10. {
  11. $this->createPath();
  12. $this->loadRoutingFile($this->path['contoller']);
  13. $path = $this->searchRouting($this->path['contoller'] . '/' . $this->path['action'], $this->
  14. routingFile);
  15.  
  16. $this->setAction($path);
  17. $this->setContoller($path);
  18. }
  19.  
  20. private function searchRouting($search, $array)
  21. {
  22. $array = (object)($array);
  23. $search = trim($search, '/');
  24.  
  25. foreach ($array as $routing) {
  26. $r = trim($routing['prefix'], '/');
  27. if ($r == $search) {
  28. return $routing;
  29. }
  30. }
  31. header('Location: index.php');
  32. return false;
  33. }
  34.  
  35. private function loadRoutingFile($name)
  36. {
  37. require_once ('/libs/yaml/Yaml.php');
  38. if (isset($name)) {
  39. $this->routingFile = Yaml::parse('c:/wamp/www/framework/app/routing/' . $name .
  40. '.yml');
  41. } else {
  42. $this->routingFile = Yaml::parse('c:/wamp/www/framework/app/routing/index.yml');
  43. }
  44. }
  45.  
  46. private function createPath()
  47. {
  48. $url = explode('/', trim($_GET['url'], '/'));
  49.  
  50. if (!isset($url[0])) {
  51. $url[0] = 'index';
  52. }
  53. if ($url[0] == "") {
  54. $url[0] = 'index';
  55. }
  56.  
  57. if (!isset($url[1])) {
  58. $url[1] = 'index';
  59. }
  60. if ($url[1] == "") {
  61. $url[1] = 'index';
  62. }
  63.  
  64. if(isset($url[2]) && filter_var($url[2],FILTER_SANITIZE_NUMBER_INT,FILTER_VALIDATE_INT)){
  65. $this->parameter=$url[2];
  66. }
  67. $this->path['contoller'] = $url[0];
  68. $this->path['action']= $url[1];
  69. }
  70.  
  71. public function getAction()
  72. {
  73. return $this->action;
  74. }
  75.  
  76. public function getContoller()
  77. {
  78. return $this->controller;
  79. }
  80.  
  81. public function getParameter()
  82. {
  83. return $this->parameter;
  84. }
  85.  
  86. public function setAction($path)
  87. {
  88. $this->action = $path['action'];
  89. }
  90.  
  91. public function setContoller($path)
  92. {
  93. $this->controller = $path['controller'];
  94. }
  95.  
  96.  
  97. }

Bootstrap.php
  1. require_once 'core/Routing.php';
  2. class Bootstrap
  3. {
  4. public function __construct(){
  5. $routing=new Routing();
  6.  
  7. require_once('/app/controllers/'.$routing->getContoller().'Controller.php');
  8. $contoller=$routing->getContoller().'Controller';
  9. $action=$routing->getAction().'Action';
  10.  
  11. $page=new $contoller();
  12. $page->$action($routing->getParameter());
  13. }
  14.  
  15. }



Chciałbym aby mój kod był uniwersalny i był elastyczny dla wielu różnych projektów. Chciałbym też aby został napisany o dobre praktyki OOP. Głównie to właśnie zależy mi na wysokiej jakości kodu. Co myślicie o takim rozwiązaniu tego zagadnienia? Wszystko działa w tym routingu. Jednak bardzo mi zależy aby pisać przemyślany kod. Gdzie popełniłem jakiś błąd projektując ten routing ?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
!*!
post
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


Odpowiedź już padła, zakładając że masz dobry router a uri wygląda tak:

Cytat
/user/all

Przekazać masz wartość nr 2 czyli "all"

  1. $model = new User('tu wartość jaką masz przekazać czyli all');


lub uri jakieś inne

Cytat
/user/all/name/stefan

Zakładając że wybierasz przez router tylko "all" i "stefan"

  1. $model = new User('tu wartość jaką masz przekazać czyli all', 'stefan');


itd.

Oczywiście wszytko musisz rozplanować, sprawdzić 40 razy który wariant będzie dobry. Tak czy inaczej, jeśli masz klasę URI która pobiera tą wartość, to przez Router na nich operujesz odsyłając do kontrolera i metody z parametrami.

Jeśli chcesz przekazywać parametry, to może Cie zainteresować ta funkcja call_user_func_array

Ten post edytował !*! 18.01.2013, 14:51:38
Go to the top of the page
+Quote Post

Posty w temacie
- brzoza91   Routing we wlasnym MVC   13.01.2013, 17:22:15
- - r4xz   kilka uwag, jeśli chcesz własny, a jednak przemyśl...   13.01.2013, 17:43:05
|- - brzoza91   Cytat(r4xz @ 13.01.2013, 17:43:05 ) u...   13.01.2013, 18:03:55
- - !*!   Zapisz ścieżkę do aplikacji w jakiejś stałej, poni...   13.01.2013, 18:09:22
- - brzoza91   okej, tą ścieżkę i autoloader miałem w planach w...   13.01.2013, 18:14:20
|- - r4xz   Cytat(brzoza91 @ 13.01.2013, 18:14:20...   13.01.2013, 19:03:08
- - brzoza91   tworząc każdy nowy projekt będę tworzył nowe pliki...   13.01.2013, 21:07:54
- - !*!   Poczytaj o standardach PSR-0/1/2 tam masz wyjaśnio...   13.01.2013, 21:10:54
- - brzoza91   okej, poczytam. ale gdy użyje takich przestrzeni ...   13.01.2013, 21:20:05
- - !*!   Ponieważ oprócz NS musisz napisać autoloader(napis...   13.01.2013, 21:23:25
- - brzoza91   a gdzie byście umieścili obiekt klasy PDO ? w klas...   14.01.2013, 00:26:01
|- - !*!   Cytat(brzoza91 @ 14.01.2013, 00:26:01...   14.01.2013, 10:29:02
|- - brzoza91   Cytat(brzoza91 @ 14.01.2013, 00:26:01...   16.01.2013, 14:44:35
|- - markonix   Cytat(brzoza91 @ 16.01.2013, 14:44:35...   16.01.2013, 14:50:08
|- - brzoza91   Cytat(markonix @ 16.01.2013, 14:50:08...   16.01.2013, 15:17:45
- - !*!   @up przeczytaj raz jeszcze mój ostatni post i to c...   17.01.2013, 10:21:36
|- - brzoza91   Cytat(!*! @ 17.01.2013, 10:21...   17.01.2013, 12:25:33
- - markonix   Utwórz nową metodę która pobierze "wszystkich...   17.01.2013, 14:07:43
- - sazian   wiem że pewnie teraz zostanę zbesztany ale co tam ...   17.01.2013, 23:34:40
|- - hind   Cytat(sazian @ 17.01.2013, 23:34:40 )...   18.01.2013, 08:18:12
- - !*!   sazian - tylko że w Twoim wypadku to już nie jest ...   18.01.2013, 11:48:04
- - brzoza91   no dobrze teraz wiem, że musi być w modelu obsługa...   18.01.2013, 14:28:57
- - !*!   Odpowiedź już padła, zakładając że masz dobry rout...   18.01.2013, 14:50:00


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 18:57