Php правильно ли это?

GI80

Турист
Credits
0
hellfire, ну так поделись с народом своими мыслями. Видишь какое горячее обсуждение вызвал твой вопрос. ))))
 

hellfire

Турист
Credits
0
Ок значит так для начинающих вполне подходит и моя структура во-первых в ней не путаешься а во-вторых по названию файла сразу ясно что он делает, но совсем другое когда создаёться большой проект в котором учавствуют как PHP кодеры так и дизайнеры и т.д. и еще куча народа там уже помоему должно быть по другому.
Сейчас я делаю так:
Создаю каталоги:
1.HTML здесь лежат заготовки форм страничек и т.д.
2.INC здесь лежат библиотечные файлы
3.INIT а здеся файлы дя настройки
4.PICS катинки
ну покамись вот и все каталоги
потом просто в одном единственном файле все это выполняеться тоесть исполняемый скрипт всего один но здесь сразу видно один недостаток в этом скрипте очень много case'ов.
Вроде все если че не то сморозил извините.
 

jonjonson

Турист
Credits
0
пример как не делать много ветвящихся структур...
PHP:
// Простенький пейдж котнроллер
// --- Пути к файлам
define('PATH_CONTROLLERS', $_SERVER["DOCUMENT_ROOT"].'/controllers/');
define('PATH_VIEWS',       $_SERVER["DOCUMENT_ROOT"].'/views/');

// --- карта имеющих место страниц
$pages_map = array('default' =>'main',
                   'news'    =>'news',
                   'about'   =>'about',
                   'services'=>'services',
                   'job'     =>'job',
                   'feedback'=>'feedback');

// --- проверяем какая страница выбрана через index.php?view=???
if(isset($_GET['view']) && array_key_exists($_GET['view'], $pages_map)){
    $page = $_GET['view'];
}else{ // --- Если не выбрана ни одна из указанных в мапе страниц
    $page = $pages_map['default'];
}

// --- Фаил апликейшин контроллера для данной страницы
if(!file_exists(PATH_CONTROLLERS.$page.'.php') 
   || !is_file(PATH_CONTROLLERS.$page.'.php'))
    die('Error: File Controller Not Defined!');
require_once(PATH_CONTROLLERS.$page.'.php');

// --- Фаил отображения для данной страницы
if(!file_exists(PATH_VIEWS.$page.'.php') 
   || !is_file(PATH_VIEWS.$page.'.php'))
    die('Error: File View Not Defined!');
require_once(PATH_VIEWS.$page.'.php');
 

RomanbI4

Турист
Credits
0
Сиё чудо называется FrontController (Sun об этом хорошо пишет). Нужно только хорошо обрабатывать эту переменную action. Типа удалять ../ , а то посмотрят то, что ненужно.
2 jonjonson
Тебя первый малокосо факнит с таким кодом...
 

jonjonson

Турист
Credits
0
RomanbI4, и каким же образом?

И еще, это не фронт контроллер, а пейдж контроллер. Фронт контроллер занимается несколько иными задачами (скажем, выполняет код связанный со всеми страницами сайта, например запускает тот же пейдж контроллер, а так же предварительный фильтр и пост фильтр).
 
Последнее редактирование модератором:

GI80

Турист
Credits
0
jonjonson, может быть посоветуешь народу какую-нибудь литературу по теме? Или расскажешь где сам черпал информацию?
 

jonjonson

Турист
Credits
0
GI80, на самом деле литературы именно о ООП разработке в PHP практически нет. Из серьезных и только на английском могу посоветовать эту http://www.phparch.com/shop_product.php?itemid=96 (попадался варезный вариант).
Восновном черпаю информацию на форуме пхп клуба http://phpclub.ru/ . Так же из их журнала пхп инсайд http://phpclub.ru/detail/magazine/ . На английском на форуме http://www.sitepoint.com/forums/forumdisplay.php?f=147

Плюс ко всему приходится обращаться к литературе по Java , и потом делать нечто по аналогии.
 

Vah

Турист
Credits
0
вот элементарный pg-controller

PHP:
                 if(!isset($_GET['part'])){
                     $part='index';
                 }else{
                     $part=$_GET['part'];
                 }
                 if(file_exists('mods/parts/'.$part.'.php')){
                     @include('mods/parts/'.$part.'.php');
                 }else{
                     @include('mods/parts/404.php');
                 }
 

RomanbI4

Турист
Credits
0
Люди, вы хоть поясняйте народу, что нужно проводить чистку переменных.
В случае с vah, $_GET['page'] можно легко подменить на ../../../../etc/ ... сами дальше знаете чё...
2 jonjonson
Вышесказанное и к твоему коду относится.
И чем же ты тогда различаешь Front-контроллер и Page контроллер? По мне так одно является частью другого...
 

Vah

Турист
Credits
0
RomanbI4 а данный код не претендует на оригинальность..... это элементарный pg-контроллер........
а давайте тут ещё про безопастность начнем говорить?? кстать, вот у джонсона такого бага не может быть..... у ниво инклуд из массива дергаеццо......

кстать, можно на веб сервер сделать chroot куда нить и ты ваще кроме пустой виректории ничего не прочитаешь..... тут ещё и от админа сервера много зависит........ ;)

мона доработать ево.... это не долго если голова на плечах..... ;)
PHP:
$page=isset($_GET['page']) ? basename($_GET['page']) : 'index';
$page=file_exists("inc/".$page.".inc.php") ? "inc/".$page.".inc.php" : "inc/404.inc.php";
if($page==='')$page="inc/index.inc.php";
@include($page);

кстати, плюс ко всему вышесказаному, ну введешь ты ../../../../etc/ и что патом...... какое файло ты там прочитаешь если в конце ".php" приписываеццо????
PHP:
'mods/parts/'.$part.'.php'

Кстать, если умный такой - предложи свой способ, мега защищенный и настолькоже простой..... ;)
 
Последнее редактирование модератором:

Vah

Турист
Credits
0
я думаю он имел ввиду вот такую строчку и т.п.
PHP:
basename($_GET['page'])
 
Последнее редактирование модератором:

Vah

Турист
Credits
0
Кстать, что касаеццо головного вопроса, по теме......

Архитектуру сайта - ты можешь выбирать, не спрашивая нас...... хоть нахови каталоги не inc pic и т.д. а 01 02 03 ну и т.д. по порядку...... главное что ты это знаешь.....

Насчет реалиции кода.....

У тебя есть index.php...... понимаю что от С++ с ф-ей main() для системщика отвыкнуть сложно но тем не менее.......
Я бы сделал так:

в скрипте index.php написал бы грубо говоря все содержание анологичное ф-ии main().....

по модулям раскидал бы классы и ф-ии..... т.е. сделал бы библиотеки.......... и в самих библиотеках спрограммировал бы обработчики ошибок и т.д. и т.п.

по поводу разделения кода от форм (html'a) - сделай файлик, например output.php и инклудь его...... и в нем храни весь хтмл..... в виде функций.....

можно даже к классы впихивать такие вещи как:
PHP:
class user{

function user(...){
....
}

.....
.....
.....

function print_register_user_form($handler){
 if(function_exists($handler)){
  $handler();
 }
}

}

function p_reg_form(){
 echo "<form ... >";
......
......
......
}

$u=&new user();
$u->print_register_user_form("p_reg_form");

т.е. чтобы менять дизайн легко было, не изменяя класса - просто переназначать обработчики ф-й в классе........

моя точка зрения ваапще - как удобнее - так и работай.... не надо спрашивать как работать тебе и правильно ли ты делаешь......... ну и что, что ты не так как все делаешь - молодец........ возможно у тебя где-то конечно есть избыточный код, но главное чтоб работало нормально....... и быстро........ =)
 

jonjonson

Турист
Credits
0
RomanbI4, как тебе уже мягко заметили, в моем коде жесткий мапинг, который впринципе обламывает вставку всякой лажи. Кроме того, как опять уже отметили, вызываются php файлы (с проверкой их наличия), и что попало уже вызвать не возможно.

Теперь о разнице между фронт контроллером и пейдж контроллером...

Фронт контроллер выполняет код общий для всех страниц (например связанный со слешеванием GET и POST переменных, авторизацией и т.д.). У него может быть пред фильтр и пост фильтр (последний например может "сжимать" html код, отдаваемый посетителю).

Пейдж контроллер выполняет код связанный с конкретной страницей (определяет необходимые view, доступность его посетителю на основе имевшей место ранее авторизации, запускает апликейшен контроллер).

И еще имеет место апликейшен контроллер, который выполняет код, связанный с экшинами, возможными для данной страницы.
 
Сверху