
Symfony
136
Вклад в тег
... PHP (Уже получше). Что посоветуете почитать?.
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
class Extension1
{
public function renderContent()
{
return "Hello";
}
}
class Extension2
{
public function renderContent()
{
return "Word!";
}
}
class MicroApp
{
private $extensions;
public function __construct($extensions)
{
foreach ($extensions as $extension) {
$this->extensions[] = new $extension();
}
}
public function run()
{
echo "<!DOCTYPE html>";
foreach ($this->extensions as $extension) {
echo htmlspecialchars($extension->renderContent(), ENT_COMPAT, 'UTF-8', true) . " ";
}
echo "</html>";
}
}
$app = new MicroApp([
'Extension1',
'Extension2',
]);
$app->run();
<?php
// Постарался упорядочить в порядке уменьшения силы вырывания
// волос на голове
$power = null;
$power .= '1. Перейти на PHP 5.6';
$power .= '2. Composer';
// level up
// Пароли? Да... А так не стоит. Вычёркивай.
$power .= '3. Отказаться от md5';
// Да прибудет с тобой ООП.
$power .= '4. Фреймворки!';
// Буквально 5 команд выучишь, ничего сложного
$power .= '5. Разобраться с VCS ';
// level up
$power .= '6. Никогда не лазить в БД на продакшн, использовать миграции';
$power .= '7. Внешние ключи, триггеры и процедуры';
// Про ключики и связи надо раньше узнать, чем о существовании новомодной базы.
$power .= '8. Базы данных (посмотреть другие)';
// Опечатался надеюсь?
// Точку на 2 слова левее.
$power .= '9. Трейты вместо Array. Генераторы';
// Панацея?
$power .= '10. PHPStorm';
// Это пригодится в командной разработке.
// По началу ты будешь гуглить, как откатить последний коммит
// и будешь пушить только в мастер.
$power .= '11. Начать работать по git workflow
* Всегда есть стабильная ветка, чьё состояние точно соответствует состоянию продакшна
* Каждой задаче — своя ветка
* Ветки могут быть разных типов, в зависимости от типа задачи
* Любая ветка рано или поздно будет влита в стабильную (тем или иным путём) и/или удалена
';
// level up
// Для следующих перечисленных надо будет уже знать, как писать тесты,
// понимать как работает система контроля версий.
// Осознанно к ним придёшь уже обматерив не один фреймворк.
$power .= '12. Teamcity, Jenkins, Bamboo (инструменты для выкладки релизов)';
$power .= '13. Phing, Capistrano, Ant (сценарии сборки)';
// Если линуха, не вздумай сделать после сборки "make install"
$power .= '14. Поиграться с PHP 7';
$fullPower = (100 * ('0.' . mb_strlen($power, 'UTF-8'))) . '%';
// В $fullPower содержится число характеризующее довольно хорошего разработчика.
{#- /views/header.twig -#}
<div>
<div class="left">
{% include "/views/header/left" %}
</div>
<div class="right">
{% include "/views/header/right" %}
</div>
</div>
{#- /views/header/left.twig -#}
<ul>
<li><a href="#!">Link</a></li>
<li><a href="#!">Link 2</a></li>
</ul>
{#- /views/header/right.twig -#}
<p class="text-left">Right</p>
{#- /views/base.twig -#}
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>{% block title %}Hello!{% endblock %}</title>
</head>
<body>
<div class="row">
<div class="col-md-2">
{% include "/views/header.twig" %}
</div>
<div class="col-md-10">
{% block content %}{% endblock %}
</div>
</div>
<div class="row">
<div class="col-md-12">
{% block footer %}{% endblock %}
</div>
</div>
</body>
</html>
{#- /views/ajax.twig -#}
{% block content %}{% endblock %}
{#- /views/pages/base.twig -#}
{% extends "/views/base.twig" %}
{% block title %}
Welcome.
{% endblock %}
{% block content %}{% endblock %}
{% block footer %} (c) 2015 {% endblock %}
{#- /views/pages/blog/index.twig -#}
{% extends app.isAjax() ? "/views/pages/ajax.twig" : "/views/pages/base.twig" %}
{% block title %}
{{ parent() }} This best blog.
{% endblock %}
{% block content %}
<h1>Header</h1>
<p>Content text</p>
{% endblock %}
{% block footer %}{#- remove parent -#}{% endblock %}
Что тут происходит.
При рендере /views/pages/blog/index.twig
шаблонизатор будет подниматься вверх.
В нём переопределяем footer, дополняем title.
title = "??? This best blog."
footer = ""
content = "<h1>...."
index (проверка переменной) +-> ajax.twig -> вывод
|
| or
|
+-> page/base.twig +
|
+----------------------------------------+
| Тут по пути уже к базовому шаблону переопределяем footer и title
| title = "Welcome. This best blog."
| footer = ""
| content = "<h1>...."
|
v А тут уже include
base.twig - - - > header.twig - + - - > left.twig
| + - - > right.twig
v
вывод
+---------------------------------------+
| +-----------------------------------+ |
| | | |
| | +--------------+ +--------------+ | |
| | | left | | right | | | header
| | +--------------+ +--------------+ | |
| | | |
| +-----------------------------------+ |
| | | |
| | +----------------------------+ | | base | ajax
| | | Welcome. This best blog. | | | title
| | +----------------------------+ | |
| | | |
| | +----------------------------+ | |
| | | Header | | | content
| | | Content text | | |
| | +----------------------------+ | |
| | | |
| +-----------------------------------+ |
+---------------------------------------+