Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Роутинг на PHP


Автор: bigturtle 8.6.2015, 18:49
Добрый день. Пишу небольшой тестовый MVC. Пособирал кое что из интернета.

Код

class Routing
{
    static function execute() 
    {
    

    
        $controllerName = 'Main';    
        $actionName = 'index';
        

        $address = strtolower($_SERVER['REQUEST_URI']);
        //$address = strstr($address,'http://localhost/rout/');
        
            

        $piecesOfUrl = explode('/', $address);
        
        
    
    
        if (!empty($piecesOfUrl[1])) 
        {
            $controllerName = $piecesOfUrl[1];
        }
        if (!empty($piecesOfUrl[2]))
        {
            $actionName = $piecesOfUrl[2];
        }
        $modelName = 'Model_' . $controllerName;
        $controllerName = 'Controller_' . $controllerName;
        $actionName = 'action_' . $actionName;
        $fileWithModel = strtolower($modelName) . 'php';
        $fileWithModelPath    = "application/models/" . $fileWithModel;



Вот кусочек класса. Проблема в том, что если его запускать из локального адреса например http://Localhost/rout/

то будет подключаться контроллер rout. То есть роутер считает что адрес сайта это http://Localhost, а rout/ это контроллер.  Это бы подходило если бы это было в интернете например www.site_name.ru/index.php
а на локальной машине не то.... То есть нужно сделать что бы адрес универсально изменялся.
Спасибо.

Автор: ksnk 9.6.2015, 13:58
Точка входа единая на всю систему? Вот она, точка входа, и знает соответствие между __DIR__, $_SERVER['DOCUMENT_ROOT'] и $_SERVER['REQUEST_URI'].

Что-то вроде такого (кусочек файла index.php - единой точки входа в систему)
Код

$relative_index=str_replace($_SERVER['DOCUMENT_ROOT'],'',__DIR__);
 
Разумно сохранить эту переменную в закромах системы.

А в роутинге нужно выкидывать с начала $_SERVER['REQUEST_URI'] этот самый $relative_index и анализировать все это хозяйство дельше.

P.S.
Для Windows нужно писать страшнее, вроде
Код

...
str_replace(str_replace('\\','/',$_SERVER['DOCUMENT_ROOT']),'',str_replace('\\','/',__DIR__))
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)