Я пытаюсь создать хороший PHP-фреймворк для личного использования.Я понимаю, что существует множество существующих, но это отличный опыт обучения, который охватывает огромное большинство различных задач и действительно многому меня учит, а также готовый продукт, когда я готов, который, я надеюсь, можно использовать для разработки других проектов изи так как я строю это, не должно быть никакой кривой обучения тому, как использовать это.
Некоторые из основных целей,
- Используйте PHP Object Oriented вместо процедурных.
- Используйте MVC или что-то подобное, чтобы узнать больше об этом стиле.
- Быть легким и быстрым /хорошая производительность
Вот моя запланированная структура сайта, за исключением некоторых других папок для javascript, изображений, css, некоторых вспомогательных функций / файлов и т. д.
///////////// Структура сайта /////////////
site.com/
/index.php
site.com/library/
/Config.class.php
/Photos.class.php
/Mail.class.php
/Filter.class.php
/QRcodes.class.php
/Router.class.php
/Database.class.php
/Templates.class.php
/etc, etc,etc......
site.com/modules/
/account/
/model
/views
/controllers
/users/
/model
/views
/controllers
/messages/
/model
/views
/controllers
/API/
/model
/views
/controllers
/forums/
/model
/views
/controllers
/blogs/
/model
/views
/controllers
/etc, etc, etc, etc.............
/model
/views
/controllers
Я решил направить весь запрос через одну точкуof index.php
Я создам класс / объект Router, который будет сопоставлять URI с картой возможных пунктов назначения с использованием регулярных выражений.Вот фрагмент того, что у меня есть сейчас для этой части ...
<?php
//get url from URL
$uri = isset($_GET['uri']) ? $_GET['uri'] : null;
$uri_route_map = array(
//users/account like http://mysite.com/users/324 (any digit)
'users/friends/page-(?<page_number>\d+)' => 'modules/users/friends/page-$1',
'users/friends/edit/page-(?<page_number>\d+)' => 'modules/users/friends/edit/page-$1',
'users/friends/edit' => 'modules/users/friends/edit',
'users/friends/' => 'modules/users/friends/',
'users/online' => 'modules/users/online/' ,
'users/online/page-(?<page_number>\d+)' => 'modules/users/online/page-$1',
'users/create' => 'modules/users/create',
'users/settings' => 'modules/users/settings',
'users/logout(?<page_number>\d+)' => 'modules/users/logout',
'users/login' => 'modules/users/login',
'users/home' => 'modules/users/home',
//forums
'forums/' => 'modules/forums/index',
'forums/viewthread/(?<id_number>\d+)' => 'modules/forums/viewthread/$1',
'forums/viewforum/(?<id_number>\d+)' => 'modules/forums/viewforum/$1',
'forums/viewthread/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewthread/$1/page-$2',
'forums/viewforum/(?<id_number>\d+)/page-(?<page_number>\d+)' => 'modules/forums/viewforum/$1/page-$2',
// TESTING new method to define class and page better!
'users/home' => array('PAGE CLASS NAME', 'ACTION NAME')
//blog routes coming soon
//mail message routes coming soon
//various other routes coming soon
);
//////////////////////////////////
class Router
{
public function __construct()
{
}
public function get_route($uri, array $uri_routes)
{
foreach ($uri_routes as $rUri => $rRoute) {
if (preg_match("#^{$rUri}$#Ui", $uri, $uri_digits)) {
//if page number and ID number in uri then set it locally
$page_number = (isset($uri_digits['page_number']) ? $uri_digits['page_number'] : null);
$id_number = (isset($uri_digits['id_number']) ? $uri_digits['id_number'] : null);
echo '<hr> $page_number = ' . $page_number . '<BR><hr> $id_number = ' . $id_number;
$uri = preg_replace("#^{$rUri}$#Ui", $rRoute, $uri);
echo '<BR><BR>Match found: ' . $uri_routes . '<BR><BR>';
break;
}
}
$uri = explode('/', $uri);
}
}
$uri = new Router();
$uri = $uri->get_routes($_GET['uri'], $uri_route_map);
?>
ОБРАТИТЕ ВНИМАНИЕ
КОД ВЫШЕ ВСЕ ВСЕ ТЕСТ-КОД И БУДЕТ ИЗМЕНЕН, ЭТО ТОЛЬКО КОНЦЕПЦИЯ
Итак, как вы можете видеть, я планирую получить index.php для получения URI, проверить его на предмет допустимых путейесли он найден, он включает или создает раздел заголовка, затем создает раздел содержимого и, наконец, нижний колонтитул страницы.
Если бы вы получили доступ, например ... www.test.com / blogs / userid-32423 / page-23
Страница будет ...
- build header ()
- создавать объектные блоги ... $ blogs = новые блоги;
- вызывать $ blogs-> viewbyID ($ userID, $ paging);// $ userID будет 32423, а $ paging будет 23 из URI
- нижнего колонтитула сборки
Теперь основано на моей структуре папок.Я полагаю, что файл класса блогов в нашем приведенном выше примере будет считаться CONTROLLER .Если я до сих пор прав, то этот класс блогов, который вызывает blogs-> viewbyID (ID, PAGE), метод viewbyID, будет устанавливать некоторый код, запрашивать базу данных и настраивать некоторые переменные для страницы, а затем включать блоги.файл шаблона.Этот файл шаблона блога можно считать VIEWS .
Теперь у меня может быть неверная концепция, и поэтому я опубликовал так много кода и текста, чтобы попытаться объяснить свой взгляд на него, пожалуйста, дайте мне мысли, предложения, скажите, где я совершенно неправ, итам, где я могу быть на правильном пути, я буду очень признателен за любую конструктивную критику или мысли.Если я прав в своем вышеупомянутом использовании части View, Controller шаблона MVC, то какая часть моего кода будет считаться модальной?Это почему-то несколько смущает меня.
Бонусный вопрос ... А как насчет формы сообщения, где я должен обрабатывать их?В моем примере я сконцентрировался на модуле блога, поэтому давайте скажем POST для добавления новой записи в блоге и POST для редактирования записи в блоге, где они должны обрабатываться (модальные, просмотр, контроллер))