Проблема с контроллером при использовании MVC в объектно-ориентированном PHP - PullRequest
0 голосов
/ 05 января 2011

В настоящее время я программирую книжный магазин с использованием MVC на объектно-ориентированном PHP, и мне трудно разобраться, как должен работать контроллер при работе с запросами, особенно при работе с формами.

Например, у меня есть форма поиска, которая отображается, когда пользователь посещает "index.php? Action = search", однако я не уверен, как мне поступить со строкой поиска из формы, поскольку я не могу отправить "$ _GET ['action'] = выполнить поиск "еще раз, чтобы" index.php? action? search = searchstring "отправлялся в браузер, чтобы результаты поиска отображались без использования скрытого поля для отправки действия поиска, что, конечно, очень небезопасно !!

Я чувствую, что это слишком много усилий, потому что его ценность и практичность кажутся лучшим способом сделать это до сих пор !! Если вы не можете убедить меня иначе !!

Спасибо

Dan.

Ответы [ 3 ]

0 голосов
/ 05 января 2011

Нет ничего плохого в index.php?action=search&q=WHATEVER, достигнутом с этим HTML:

<form method="GET" action="index.php">
<input type="hidden" name="action" value="search" />
Search: <input type="text" name="q" />
<!-- ... -->

Примерно так и поступают поисковые системы, за исключением того, что они используют перезапись URL-адресов, чтобы сделать URL-адреса красивее. Например, поиск Bing для «теста» равен http://www.bing.com/search?q=test.

MVC может показаться хлопотным, когда вы впервые изучаете его, но на самом деле это продуктивный и удобный шаблон для веб-разработки, который намного превосходит веб-разработку в стиле «все идет».

0 голосов
/ 05 января 2011

Вы должны понимать, что MVC Patter в PHP обычно устанавливается так:

У вас есть 2 ключевые переменные:

  • класс
  • метод

И они всегда по умолчанию:

  • класс = индекс
  • метод = индекс

Поэтому, когда параметр class передается в URI, он переопределяет значение по умолчанию, поэтому при использовании index.php?class=view вышеприведенное становится:

  • класс = вид
  • метод = индекс

Там вы запускаете класс view.php, инициализируете класс представления в объект и выполняете метод следующим образом:

class View/*_Controller extends Controller*/
{
     public function index(){}
}

Любые другие переданные переменные будут доступны через запрос GET или POST.

Следует также отметить, что это обычно обрабатывается через URI в синтаксисе URL, поэтому следующий index.php?action=view&method=download становится /view/download/

Все, что находится внутри URI, после того, как класс / метод будет отправлен методу, пример ниже.

/view/download/id/browser

Это выполнит следующий метод и передаст значения переменных в контексте.

class View/*_Controller extends Controller*/
{
     public function download($id,$direction)
     {
     }
}

Теперь я знаю, что это не относится к вашему вопросу, но я думаю, что вы поступаете неправильно, и это должно помочь вам начать строить свою структуру в управляемую структуру.


Обновление

Контроллер, инициализированный GET / POST с использованием маршрутизатора, маршрутизатор - это класс, который обнаруживает класс / метод по URI, а затем находит правильный контроллер и выполняет его вместе со своим методом.

Пример роутера выглядит так:

class Router
{
    //Params
    public $route;

    public static function CreateRoute($route = false)
    {
        return new Router($route);
    }

    public function __construct($route = false)
    {
         if($route !== false)
         {
              $this->route = $route;
         }else
         {
             $this->route = $_SERVER['REQUEST_URI'];
         }

         /*
             * The route would be parsed so that the following are matched
             * {/class}{/method}{/param1}{/param1}
             * /view/download/12/direct | as example
         */
    }


    public function run()
    {
        /*
            * Here you would do the following:
            * Validate the class to make sure no one is triggering an LFI
            * Make sure the class file exists within the directory
            * Include the class file and create an instance of it
            * Execute the method  sending in the params.
        */
    }
}

Использование примерно так:

$Route = Router::CreateRoute(); //AutoDetect
$Route->run();

Взгляните на следующее изображение, может помочь вам понять. Codeigniter Application Flow Chart

0 голосов
/ 05 января 2011

Ну, в вашем случае вам действительно нужно перенаправить с дополнительным параметром. Используйте index.php?action=search&q=searchstring например. Это сохранит способность вызывать правильного «контролера» исключительно на основе параметра действия.

Что касается "MVC", то вы правы. Это не слишком применимо к веб-приложениям. Но вы могли бы прочитать о Model-View-Presenter, который лучше напоминает то, что все делают в любом случае.

...