Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Передача get запроса контроллеру
 
 автор: SkyFree   (23.03.2013 в 15:52)   письмо автору
 
 

Подскажите как можно доработать код чтобы при загрузки контролера ему можно было передать метод get с каким-то параметром так выглядит код загрузки контроллера:


class Action {
    private $registry;

    private $folder;
    private $controller;
    private $method;
    private $args;
    
    public function __construct($registry)
    {
        $this->registry = $registry;
    }
    
    public function make($action) {
        $this->folder = null;
        $this->controller = null;
        $this->method = null;
        $this->args = null;
        
        $action = preg_replace("/[^\w\d\s\/]/", '', $action);
        $parts = explode('/', $action);
        $parts = array_filter($parts);
        
        foreach($parts as $item) {
            $fullpath = APPLICATIONS . 'controllers/' . $this->folder . '/' . $item;
            if(is_dir($fullpath)) {
                $this->folder .= '/' . $item;
                array_shift($parts);
                continue;
            }
            elseif(is_file($fullpath . '.php')) {
                $this->controller = $item;
                array_shift($parts);
                break;
            } else break;
        }
        
        // Проверка папки
        if(empty($this->folder)) {
            $this->folder = 'main';
        }

        // Проверка контроллера
        if(empty($this->controller)) {
            $this->controller = 'index';
        }
        
        // Получения метода
        if($c = array_shift($parts)) {
            $this->method = $c;
        } else {
            $this->method = 'index';
        }
        
        // Получение аргументов
        if(isset($parts[0])) {
            $this->args = $parts;
        }
    }
    
    public function go() {
        $controllerFile = APPLICATIONS . 'controllers/' . $this->folder . '/' . $this->controller . '.php';
        $controllerClass = $this->controller . 'Controller';
        if(is_readable($controllerFile)) {
                require_once($controllerFile);
                
                $controller = new $controllerClass($this->registry);
                
                if(is_callable(array($controller, $this->method))) {
                    $this->method = $this->method;
                } else {
                    $this->method = 'index';
                }
                
                if(empty($this->args)) {
                    return call_user_func(array($controller, $this->method));
                } else {
                    return call_user_func_array(array($controller, $this->method), $this->args);
                }
        }else{
                       header("HTTP/1.1 404 Not Found");      
                }
    }
}
?>


загрузка контроллера происходит таким образом: папка контроллера/контроллер в папке/метод контроллера . Хочу сделать чтобы можно было передать метод get ( метод в запросе это указатель на функцию в контроллере public function index(), index это и есть метод который передается в запросе) контроллеру но что бы не пробовал не получается подскажите как можно выйти из ситуации или доработать код загрузки контроллера?

  Ответить  
 
 автор: psychomc   (23.03.2013 в 17:30)   письмо автору
 
   для: SkyFree   (23.03.2013 в 15:52)
 

знаете, не хочется даже пытаться понять что вы хотите именно доработать. очень сильно не нравится такая мешанина. класс как-то не понятно спроектирован, называется action, а выполняет функции не то роутера, не то фронт-контроллера

  Ответить  
 
 автор: SkyFree   (24.03.2013 в 11:05)   письмо автору
 
   для: psychomc   (23.03.2013 в 17:30)
 

Это и есть роутер и ведь в ООП как и в MVC не особо важно как класс называется

  Ответить  
 
 автор: SkyFree   (24.03.2013 в 11:08)   письмо автору
 
   для: SkyFree   (24.03.2013 в 11:05)
 

Make выполняет проверку на наличие контроллера
Go выполняет уже само открытие контроллера, я пытался сделать чтобы go тоесть уже при загрузке контроллеру передавался get метод

  Ответить  
 
 автор: psychomc   (24.03.2013 в 12:00)   письмо автору
 
   для: SkyFree   (24.03.2013 в 11:05)
 

как раз таки в ООП это очень важно. используя ООП вы начинаете программировать на более высоком уровне абстракции, поэтому имена классов должны бы правильными, т.е четко описывать то, что они делают.

  Ответить  
 
 автор: artart   (23.03.2013 в 20:49)   письмо автору
 
   для: SkyFree   (23.03.2013 в 15:52)
 

я извиняюсь кодировать пока не хочется ,вот ссылка http://www.youtube.com/watch?v=Kulox9AGW2A

здесь все очень просто думаю вам это поможет если нет то продолжим вашу тему

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования