PHP включает в себя вопрос о лучших практиках
Я изучаю синтаксис для PHP и практикую его. Я пришел из .NET-фона, поэтому мастер-страницы всегда делали вещи очень легкими для меня, когда дело доходило до верхних и нижних колонтитулов.
До сих пор у меня есть mainHeader.php и mainFooter.php, у которых есть мое меню и мой нижний колонтитул html. Я создал mainBody.php, а наверху я положил
<?php include "mainHeader.php" ?>
а для нижнего колонтитула я положил
<?php include "mainFooter.php" ?>
Это сработало отлично и заставило меня улыбнуться, потому что мои страницы хорошо сочетались. mainHeader имеет мои <html>
и <body>
, и мой mainFooter имеет мои закрывающие теги для них.
Это хорошая практика?
Ответы
Ответ 1
Я включаю свои представления из моих контроллеров. Я также определяю расположение файлов, чтобы упростить обслуживание.
config.php
define('DIR_BASE', dirname( dirname( __FILE__ ) ) . '/');
define('DIR_SYSTEM', DIR_BASE . 'system/');
define('DIR_VIEWS', DIR_SYSTEM . 'views/');
define('DIR_CTLS', DIR_SYSTEM . 'ctls/');
define('DIR_MDLS', DIR_SYSTEM . 'mdls/');
define('VIEW_HEADER', DIR_VIEWS . 'header.php');
define('VIEW_NAVIGATION', DIR_VIEWS . 'navigation.php');
define('VIEW_FOOTER', DIR_VIEWS . 'footer.php');
Теперь у меня есть вся информация, которая мне нужна, просто включив config.php
.
controller.php
require( '../config.php' );
include( DIR_MDLS . 'model.php' );
$model = new model();
if ( $model->getStuff() ) {
$page_to_load = DIR_VIEWS . 'page.php'
}
else {
$page_to_load = DIR_VIEWS . 'otherpage.php'
}
include( VIEW_HEADER );
include( VIEW_NAVIGATION );
include( DIR_VIEWS . $page_to_load );
include( VIEW_FOOTER );
Ответ 2
Вы также можете сделать это наоборот. У вас есть главная страница с верхним/нижним колонтитулом и включает только тело.
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<?php include $page ?>
</body>
</html>
Ответ 3
В настоящее время хорошей практикой является использование механизма шаблонов, например smarty. Для всего приложения рассмотрите возможность использования framework, например codeigniter.
Ответ 4
Что вы делаете, это нормально, пока вы не начнете использовать "Просмотры" или "Шаблоны", и в этом случае вы больше не упорядочиваете свой контент HTML внутри "контроллера" или "действия".
Вместо этого вы загружаете представление и заполняете его значениями, которые оставляют все исходные тексты HTML для представления, а не вашим файлом PHP.
$view = new View('layout.php');
$view->header = $header;
$view->content = 'This is the main content!';
$view->footer = $footer;
print $view;
который затем загружает файл макета, который выглядит примерно так:
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<div id="header"><?php print $header; ?></div>
<div id="content"><?php print $content; ?></div>
<div id="footer"><?php print $footer; ?></div>
</body>
</html>
Ответ 5
Подводя итог всему вышесказанному.
Этот хороший способ использования включает, но не забудьте использовать страницу шаблона для содержимого страницы.
Частично основано на Галене и Балусе:
page.php
require $_SERVER['DOCUMENT_ROOT'].'/../config.php';
$data = get_data(); // assume we get all required data here.
$pagetitle = "This is a sample page";
$template = "page.tpl.php";
include "main.tpl.php";
main.tpl.php
<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $pagetitle?></title>
</head>
<body>
<?php include $template ?>
</body>
</html>
page.tpl.php
что-то вроде этого:
<h1><?php echo $pagetitle?></h1>
<?php if (!$data): ?>
No news yet :-(
<?php else: ?>
<ul>
<? foreach ($data as $row): ?>
<li><a href="news.php?id=<?php echo $row['name']?>"><?php echo $row['name']?></a></li>
<?php endforeach ?>
</ul>
<?php endif ?>
Ответ 6
Это прекрасный метод, если ваш сайт не превышает 20-страничный порог. Однако я бы посоветовал использовать include() в стиле функции, а не как конструкцию, и поместить эти шаблоны в отдельную подпапку. Если в них нет PHP-кода, также используйте расширение .htm файла (htm, обозначающее частичный html).
include("template/main/header.htm"); // would still parse PHP code!
Недостатком такого подхода является то, что вы в конечном итоге вводите HTML через глобальные переменные в него. $HEAD='<link...>'; include("../header.htm")
. Который не плох сам по себе, но может быстро накормить рывок.
Ответ 7
Мне нравится использовать функции для печати верхних и нижних колонтитулов вместо входящих. Вы можете точно настроить область переменной таким образом.
Ответ 8
Для небольших сайтов include/include_once и require/require_once здорово, я не создал сайт без них за многие годы. Однако я бы рекомендовал убедиться, что каждый из ваших включенных файлов представляет собой дискретный блок кода, который является допустимым XML. Я имею в виду, не открывать тег в одном include и закрывать его в другом, или наоборот - это сделает изменения сложными и более подверженными сломать вещи, потому что у вас есть зависимости между файлами. Счастливое кодирование!
Ответ 9
Я знаю, что это очень поздно, просто хотел добавить мои "копейки" к этому вопросу.
Мое предложение было бы создать методы для этого, например, мой корень: var/www/htdocs/, а файл функций находится в include/functions/template-parts.php.
Мои функции будут выглядеть так:
<?php
define("DOC_ROOT", "/var/www/htdocs/"); # Add a trailing slash to make it a little easier
function GetHeader()
{
return include DOC_ROOT . 'includes/parts/header.htm'; # Header found at include/parts/header.htm
}
function GetFooter()
{
return include DOC_ROOT . 'includes/parts/footer.htm'; # Footer found at include/parts/footer.htm
}
?>
И используется как таковой:
<?php
# From the main page (/var/www/htdocs/index.php)
require_once 'includes/functions/template-parts.php';
GetHeader();
?>
<!-- Page content -->
<?php
GetFooter();
?>