Автор Тема: Създаване на чисти url адреси с php  (Прочетена 6942 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

Stan

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 27
  • -Получени: 135
  • Публикации: 641
Здравейте, преди няколко дена гледах това видео за Създаване на чисти url адреси с php и мисля, че ще бъде полезно за начинаещи, а и не само.Целта на упражнението е да направим url от вида:

http://domain.com/product.php?category=12 на http://domain.com/product/category/12

С този метод, ще премахнем лично за мен досадните символи "?","&","=", които са градивна част от GET метода на предаване на информация.
Преди да поясня някой неща, искам да кажа, че този ефект може да се постигне също, само и едиствено чрез модула mod_rewrite на apache-то:

Код: Apache configuration
  1. RewriteEngine on
  2. RewriteBase /
  3. RewriteRule ^product/category/(\d+)$  product.php?category=$1

Ако искаме обаче всички url адреси на сайта да изглеждат така то тябва да пишем за всяка страница подобни правила, или пък да напишем определени, за които обаче трябват повечко познания по конфигурирането на apache за да няма неприятни моменти.
С метода от видеото ще направим url адресите изчистени с помоща на php без да са необходими някакви сериозни познания.
Нека въведем следния url адрес :

http://domain.com/index.php/product/category/12

Ако съществува файла index.php в root директорията на сайта ще се визуализира неговото съдържание като частта след разширението .php няма да окаже влияние.Понеже тази част не представлява GET параметри възниква въпроса как да взмем стойностите.Нека видим при подадения по-горе адрес какво се съдържа в следните елементи на масива $_SERVER:

Код: PHP
  1. echo $_SERVER['REQUEST_URI'].'<br />'.$_SERVER['PATH_INFO'];

Вижда се, че в $_SERVER['PATH_INFO'] се съдържа само нужната ни част, а в $_SERVER['REQUEST_URI'] се съдържа и името на файла.Как да направим така, че хем да "премахнем" index.php от url адреса, хем да вземем нужната ни част?
Ами ще използваме модула mod_rewrite на apache-то:

Код: Apache configuration
  1. RewriteEngine on
  2. RewriteBase /
  3. RewriteCond %{REQUEST_FILENAME} !-f
  4. RewriteCond %{REQUEST_FILENAME} !-d
  5. RewriteRule ^(.*)$ index.php/$1

Най-общо казано редове по-горе правят следното: ако подадения адрес не е път до същестуващ файл на сървъра и не е път до съществуваща директория, то частта след домейна и неговото разширение ще бъде разбирано като index.php/частта след домейна и неговото разширение.
Пример:

http://domain.com/product/category/12 ще бъде разбиран като http://domain.com/index.php/product/category/12

Така вече в $_SERVER['REQUEST_URI'] ще се съдържа нужната ни част: /product/category/12
С помоща на функцията explode можем да вземем стойностите между наклонените черти, като се създаде масив с елементи които съдържат тези стойности,като се започне от елемента с ключ 1.
Във видеото е използван елементарен клас, състоящ се от конструктор и два метода за взимането на тези стойности:

url.php
Код: PHP
  1. class url {
  2.         private $site_path;
  3.        
  4.         public function __construct($site_path) {
  5.                
  6.                 $this->site_path = $this->removeSlash($site_path);
  7.                
  8.         }
  9.         private function removeSlash($string) {
  10.                 if($string[strlen($string) - 1] == '/')
  11.                         $string = rtrim($string, '/');
  12.  
  13.                 return $string;
  14.        
  15.         }
  16.         public function part($part) {
  17.        
  18.                 $url = str_replace($this->site_path, '',$_SERVER['REQUEST_URI']);
  19.                 $url = explode('/', $url);
  20.                 if(isset($url[$part]))
  21.                
  22.                         return $url[$part];    
  23.                        
  24.                 else
  25.                
  26.                         return false;
  27.        
  28.         }
  29. }

В конструктора въвеждаме параметър, в който при инстанция на класа ще въвеждаме пътя до index.php файла.
1.ако е в root директорията пишем /
2.ако е в поддиректория /поддиректория
3.ако е в поддиректория можем да я запишем и така /поддиректория/(При случаи 1. и 3. ни е необходим метода removeSlash.)
Във втория метод part проверяваме дали съществува дадена част от url адреса ни.
Нека при адрес http://domain.com/product/category/12  частта product да бъде името на страницата, тоест стойността в $url[1], която се връща при извикването на метода part ( $променлива->part(1) ).В index.php пишем:

Код: PHP
  1. //добавяме класа като посочваме пътя до него, в случая в директория classes
  2. include 'classes/url.php';
  3. //правим инстанция на класа
  4. $url = new url('/');
  5. //проверяваме дали сме в началната страница http://domain.com
  6. $page = $url->part(1);
  7. if(!$page)
  8.         include 'files/home.php';
  9. //ако не сме проверяваме дали имаме такъв файл в поддиректория в случая files и го вмъкваме       
  10. else
  11.         if(file_exists('files/'.$page.'.php'))
  12.        
  13.                 include 'files/'.$page.'.php'; 
  14.                
  15.         else {
  16.                 header("Status: 404 Not Found");
  17.                 include '404 error page';
  18.                 exit;
  19.         }
   
   
И така в $url->part(2,3,и т.н) ще се съдържат другите части  от url адреса, ако има такива, които можем да изпозлваме във вмъкнатите страници.Тези части всъщност могат да играят ролята на GET параметри като, ако искаме да проверим дали съществува дадена част:
Код: PHP
  1. //вместо
  2. if(isset($_GET['category']))
  3. //изпозлваме
  4. if($url->part(2) == 'category')

Изгледайте видеото много е лесно за разбиране, може да си преправите кода според вашите предпочитания и начин на писане.

borovaka

  • Hero Member
  • *****
  • Благодарности
  • -Казани: 1
  • -Получени: 48
  • Публикации: 906
Re: Създаване на чисти url адреси с php
« Отговор #1 -: 27 Юни 2012, 16:53:04 »
Добро обяснение, само, че според мен трябва малко по-добре да се обясни изобщо работата на ( front controllera ) и как от там нататък ще се обработват заявките ... Защото ако някой започне да пише код който разчита на front controller, самата структура на заявка към файл > резултат , се променя. Много добро обяснение по темата има в документацията на Symfony http://symfony.com/doc/current/book/from_flat_php_to_symfony2.html#creating-the-front-controller
Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"

HD

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 208
  • -Получени: 165
  • Публикации: 3077
Re: Създаване на чисти url адреси с php
« Отговор #2 -: 28 Юни 2012, 00:51:39 »
Още едно добро обяснение.. http://framework.zend.com/manual/en/zend.controller.front.html