Я немного сбит с толку относительно того, что вы подразумеваете под MVC? Мое понимание может помочь. Моя плита, шкаф и холодильник функционируют как контроллеры в системе MVC, где моя еда и ингредиенты являются объектами данных, а то, что я положил на тарелку на обед, является видом. MVC - это просто парадигма кодирования. Вы можете применить это к чему угодно.
Я не пытаюсь уклониться от вопроса; Я просто чувствую, что мой ответ будет неполным. Я чувствую, что вы действительно спрашиваете: «Как я могу точно реализовать ту же функциональность, что и существующая инфраструктура, которая делает MVC-кодирование простым», или, если коротко, «как я могу делать то, что MVC-инфраструктура делает более чисто». И если это то, что вы просите, я боюсь пропустить большую часть, я боюсь.
Таким образом, искажение URL-адресов, на мой взгляд, будет включать программные манипуляции со строками. Я собираюсь полностью избежать этой части вашего вопроса. Это «большая часть», которую я упомянул.
Но «как я могу передавать сообщения свободно определенному объекту, как это делает Apple, сделавшая термин MVC знаменитым», я считаю, что к этому можно обратиться напрямую. Я бы сделал это с интерфейсами и диспетчерским "крючком",
abstract class Message {
// has a bunch of info about the current program state as properties,
// retrieved from e.g. $_POST or the db,
// and ways to retrieve that info automatically as methods named after the channel
// they pull information from,
// the constructor is responsible for using these methods
// so they should be protected
}
interface Action {
// now we know enough about a message to handle it in an abstract way,
// no array mapping etc.
function doSomething($Message);
}
/** do this up the same way it exists in the database */
abstract class ModelObject {
public $fields = array();
// I am a linked list
public $next = NULL;
public $prev = NULL;
// constructor that takes a primary key as an argument and pulls stuff
// from the DB with it
}
/** this has a predictable name known to the Main application controller */
hook_do_stuff() {
$state = new DoStuffMessage();
$user = new User(); // User is a ModelObject
// maybe there is even an Admin ModelObject that can use $user in its constructor?
// decide how to handle things in an abstract way here,
// maybe even run tests on the URL as it is now just another piece of
// program state information
}
После этого проведите множество тестов function_exists, и вам будет хорошо. Я думаю, вы обнаружите, что этот подход легко реализовать где угодно. Это немного сложно в таких языках, как Java, где hook_do_stuff () не может быть объектом первого класса, но до тех пор, пока вы рассматриваете любой класс, в котором есть метод main (), как «глобальную» область видимости, он все еще выполним.
В противном случае, надеюсь, я не понял неправильно, о чем вы действительно просили?