Pull to refresh

Comments 43

Где хоть строчка кода? Вон из хабов «php» и «ООП» — тут один голый «Я пиарюсь» и «Хлам»
Вас конкретно что-то интересует? Данный пост описывает опыт использования фримворка. Я не планировал делать мануал или что-то вроде урока, соответственно и примеров кода нет.
Вы конкретно что-то пишете, или просто рекламная статья?
Вопросом на вопрос — Это по европейски.
Вы таки имеете шо-то протиф? Вы антиевропеит?
Вы спрашивали — Где хоть строчка кода? Вы это так просто спрашивали, чтобы потролить?
Вы таки извините, но как можно говорить о фреймворке, без примера кода. Это всё равно как говорить о каком-то исскустве без изображения
Повторюсь, тут описывается опыт использования, а не конкретное решение какой либо проблемы. Это не урок или презентация возможностей. Опять же повторюсь, если интересует конкретика, т.е. как именно я делал то-то и то-то, отпишите. Напишу отдельный пост с примерами или размещу пример в этом посте.
1. Пример кода самого интересного контроллера
2. Роутинг
3. Орм/надстройка к базе данных, если используется специфическая для данного фреймворка
4. Сделать больший акцент на continuous integration (примеры?)
5. Есть ли генераторы кода, для каких случаев?

Для начала хватит
1. Пример кода самого интересного контроллера — вот Base контроллер от которого наследую остальные.
/**
 * Created by JetBrains PhpStorm.
 * Development: Max Znamensky
 * Date: 31.07.12
 * Time: 17:45
 * To change this template use File | Settings | File Templates.
 */

namespace Blog;

use Fuel\Core\View;
use Fueltools\Pagination;

class Controller_Base extends \Fuel\Core\Controller_Template
{
	public $template = 'index';
	public $site_name;
	public $catArr;
	public $postArr;

	public function before()
	{
		parent::before();

		//Инициализация постоянно используемых данных, таких как модели, массивы с данными
		$this->postArr = \Fuel\Core\DB::select('*')->from('posts')->cached(600)->execute()->as_array();
		$this->catArr = \Fuel\Core\DB::select('*')->from('categories')->cached(600)->execute()->as_array();

		$this->site_name = \Fueltools\StrConverter::upperFirst($_SERVER['HTTP_HOST']);

		//Назначает виджеты по умолчанию
		$this->widgetMenuLinks();
		$this->widgetMasthead();
		$this->widgetRndmLinks();
		$this->widgetRndmPosts();
		$this->widgetSearch();
		$this->setIndexVars();

		//$this->template->set_global('breadcrumbs', \Fueltools\Breadcrumb::create_links(), false);

	}


	protected function setIndexVars()
	{
		$this->template->site_name = $this->site_name;
	}

	/**
	 * Pagination
	 */
	protected function getPager($url, $total, $per_page, $segment)
	{
		$config = array(
			'pagination_url' => $url,
			'total_items' => $total,
			'per_page' => $per_page,
			'uri_segment' => $segment,
		);
		Pagination::set_config($config);
		$pagination = Pagination::create_links();

		$this->template->pager = $pagination;
	}

	/**
	 * Формирует виджет меню категорий в top menu
	 */
	protected function widgetMenuLinks()
	{
		$data = $this->catArr;
		$catMenu = \Fueltools\TreeToMenu::forge()->_buildTree($data);
		$this->template->catsmenu = $catMenu;
	}

	/**
	 * Формирует виджет с рандомными ссылками
	 */
	protected function widgetRndmLinks()
	{
		$data = $this->catArr;
		shuffle($data);
		$this->template->footerLinks = View::forge(
			'widgets/footer_random_links',
			array('links' => array_splice($data, 0, 5))
		);
	}

	/**
	 * Формирует виджет Masthead
	 */
	protected function widgetMasthead($data = array())
	{
		$catArr = $this->catArr;
		shuffle($catArr);
		$data['links'] = array_splice($catArr, 0, 40);
		$this->template->widget_masthead = View::forge('widgets/masthead', $data);
	}

	/**
	 * Формирует виджет правого блока на главной и в категориях
	 * @param $offset - кол-во выводимых статей
	 */
	protected function widgetRndmPosts($offset = 5)
	{
		$data = $this->postArr;
		//\Fueltools\FB::info($posts);
		shuffle($data);
		$this->template->widget_rndmposts = View::forge(
			'widgets/thumbnails',
			array('posts' => array_splice($data, 0, $offset))
		);
	}

	/**
	 * Виджет формы поиска
	 */
	protected function widgetSearch()
	{
		$this->template->search_form = View::forge('widgets/search/form');
	}


}

2. Роутинг
<?php return array( '_root_' => 'blog', // The default route 'blog/(:num)' => 'blog/posts/$1', // The default route 'blog/category/(:num)-(:num)-(:any)' => 'blog/category/$1/$2/$3', // The default route '_404_' => 'index/404', // The main 404 route );
3.Для ОРМ использются модели, вот пример post модели
<?php /** * Created by JetBrains PhpStorm. * Development: Max Znamensky * Date: 01.08.12 * Time: 14:54 * To change this template use File | Settings | File Templates. */ namespace Blog; class Model_Post extends \Orm\Model { protected static $_properties = array( 'id', 'title', 'short_content', 'content', 'created_at', 'author_id', 'cat_id', 'anchors', 'youtube', ); protected static $_belongs_to = array( 'user' => array( 'key_from' => 'author_id' ), 'categorie' => array( 'key_from' => 'cat_id' ) ); }
4. Извиняюсь не понял вопроса, уточните пожалуйста и если нужны примеры сообщите что именно нужно.
5. Генераторы кода есть в oil пример использоания есть тут, сам не пользуюсь.
Прошу прощения.
2. Роутинг
<?php
return array(
	'_root_' => 'blog', // The default route
	'blog/(:num)' => 'blog/posts/$1', // The default route
	'blog/category/(:num)-(:num)-(:any)' => 'blog/category/$1/$2/$3', // The default route
	'_404_' => 'index/404', // The main 404 route
);


3.Для ОРМ использются модели, вот пример post модели
<?php
/**
 * Created by JetBrains PhpStorm.
 * Development: Max Znamensky
 * Date: 01.08.12
 * Time: 14:54
 * To change this template use File | Settings | File Templates.
 */


namespace Blog;


class Model_Post extends \Orm\Model
{

	protected static $_properties = array(

		'id',
		'title',
		'short_content',
		'content',
		'created_at',
		'author_id',
		'cat_id',
		'anchors',
		'youtube',

	);


	protected static $_belongs_to = array(
		'user' => array(
			'key_from' => 'author_id'
		),
		'categorie' => array(
			'key_from' => 'cat_id'
		)
	);

}
\Fuel\Core\DB::select('*')->from('posts')->cached(600)->execute()->as_array();
Вы точно ORM используете?

И кстати, если не секрет — Какую задачу решает данный фреймворк? Чем его ОРМ лучше, например, доктрины?
Вы капитан очевидность) Помоему и так видно, что орм тут нет. Вы просили пример контроллера, а не пример ОРМ. Остальные вопросы проигнорирую, с вашего позволения.
А вы точно сделали всё, что написали?
Ни примеров кода, ни ссылки на сайт(который вы делали), ни нагрузок, раз уж вы сайт под них «оптимизировали».
У меня нет перед вами дифицита доверия. Все что описал из личного опыта, вы можете повторить, то что я сделал и уверен это будет положительный опыт использования фримворка.
Мастера Йоды вы ученик?
— Получилась гибкое приложение, где почти вся мало мальски реюзабельная логика перенесена в отдельные пакеты с целью реюзать её в следующих проектах. Пакеты это нечто постоянное и переносимое из проекта в проект. Делаешь раз и решение никуда не пропадает — это действительно потрясающе.
— Сами контроллеры лишь выполняют проверки и направляют действия.
— Большое преимущество пакетов в том, что вы можете реюзать логику везде, в шаблоне, в контроллере, в модуле.
— За все время использования фримворка обновлял ядро несколько раз — обратная совместимость не ломалась, обновление сводилось к копипасту с заменой папки core.
— Fuel на столько прост на сколько того хочешь, например я мало использую unit тестирование, oil console, разделение разработки на dev и production, oil migration и многое другое. Но я знаю одно — когда они мне понадобятся, то я с легкостью начну их применять, так как в Fuelphp нет ничего сложного.

Не могу воспринимать это серьезно. Первый и последние пункты это адов треш и угар.
Ну так поделитесь, что вы там угарного нашли, все и «поугараем»
Потому что, похоже Вы не понимаете, о чём пишете. То что вам, за время написания простенького сайта пришлось несколько раз обновлять ядро фреймворка — говорит отнюдь не в его пользу. И уж тем более, пока вы действительно не столкнулись с коммерческим применением фреймворка — глупо говорить, что на нём «всё будет легко»
Похоже это вы не понимаете о чем пишите, откуда вы взяли — То что вам, за время написания простенького сайта пришлось несколько раз обновлять ядро фреймворка?
Обновлял за все время, а не за время написания данного приложения.
глупо говорить, что на нём «всё будет легко» — глупо было бы это не проверить на ближайшием «коммерческом проекте»
предлагаете рискнуть головой, ради проверки Вашего фреймворка?
Фреймворк и правда имеет место быть. Другой вопрос, что статья ни о чем.

The framework was started in late 2010 by Dan Horrigan then shortly after the team grew to include Phil Sturgeon, Jelmer Schreuder and Harro Verton. The team has decades of PHP experience between them and have all been involved with Open-Source projects such as CodeIgniter, PyroCMS, ExiteCMS and DataMapper ORM to name but a few.

Официальный сайт
Пусть статья не о чем по вашему мнению, но признайте, что благодяря ей вы открыли для себя Fuel и возможо даже попробуете его возможности в своей разработке.
Про Fuel я узнал достаточно давно, в своей разработке я использую преимущественно yii/zf. Слабости к микрофреймворками не питаю.
С каких пор Fuel, Kohana и CI стали микрофримворками?
Рад бы, но это не мой фримворк, не я его писал. Помоему вы блефуете и скорее всего нет у вас никакого коммерческого проекта.
Перечитайте свои сообщения — почти все они содержат «наезды» — верный признак понимания слабости своей позиции, и невозможности аргументированно отвечать на вопросы.

Обзор фреймворка, как ни странно, необходим другим людям, чтоб оценить переспективы использования его в реальных проектах. Ваша статья этой информации не даёт. В этом и беда.
Помоему вам эти «наезды» причудились. Всего лишь отвечал на ваши вопросы чётко и по существу вот и всё, если чем то обидел прошу простить.

Еще раз повторюсь, это не в коей мере не обзор фримворка, а изложение субъективного опыта его использования.
Делаешь раз и решение никуда не пропадает — это действительно потрясающе.

Открыли для себя слово «компонент»?

Большое преимущество пакетов в том, что вы можете реюзать логику везде, в шаблоне, в контроллере, в модуле

Что есть для вас «логика»?

я мало использую unit тестирование, oil console, разделение разработки на dev и production, oil migration и многое другое. Но я знаю одно — когда они мне понадобятся, то я с легкостью начну их применять, так как в Fuelphp нет ничего сложного

Код который не писался с расчетом на возможность юнит/функционального-тестирования как правилило тяжко тестируем. Тот же TDD переключает голову в немного другое состояние.
В любом случае это никакого отношения к фреймворку не имеет.

Зря я вестимо распинаюсь.
Открыли для себя слово «компонент»? — В fuelphp так называется пакет о котором и писал.
Что есть для вас «логика»? — В данном контексте код отвечающий за процессы, прием и обработку данных с целью получения определенного результата.
Магистру Йоде привет) Не зря.
Выложите пример сложной view на pastebin, пожалуйста. Мне интересно как вы ре-используете логику в шаблонах.
А вот это уже вопрос) Рад. Держите —
<? foreach ($posts as $post) { ?>

<h1><? echo Html::anchor(
	\Fueltools\RepeateBlog::postLink($post), // Тут
	$post->title,
	array('title' => $post->title)
)?></h1>
<div class="row-fluid">

    <article>
        <p class="muted">
            <span class="label label-info"><? echo \Date::time_ago(strtotime($post->created_at)) ?></span>
        </p>

        <p><? echo \Str::truncate(strip_tags($post->content), 600) ?></p>
    </article>
</div>
<hr class="soften">

<? } ?>

\Fueltools\RepeateBlog::postLink($post) — формирует ссылку
Смысл в том, чтобы в шаблоне вызывать формирование правильного формата даты, обрезать данные из модели?
Зачем это делать, если формированием даты занимается более высокоуровневый обьект — модель, которой помогают настройки интернационализации? А если time_ago для post нужно будет рисовать в одном формате, а для entity2 в другом? Copy/paste.
Экранирование и фильтрация это тоже задача контроллера. Вьюха должна получать уже готовые данные.

Не похоже на best-practice, И их в вас Fuel не вдолбил. Он и не смог бы, потому что framework лишь кодобаза, реализующая типовые функции. А вы тут превозносите его :)

ps:
если уж используете шорттеги, то проще так:
A lot of text for <?=$user->getName()?>

Смысл в том, чтобы в шаблоне вызывать формирование правильного формата даты, обрезать данные из модели?
Зачем это делать, если формированием даты занимается более высокоуровневый обьект — модель, которой помогают настройки интернационализации? — помоему этого нет в Fuel, но если есть то да полностью с вами согласен.

Экранирование и фильтрация это тоже задача контроллера. Вьюха должна получать уже готовые данные. — ок я только за, как вы предлагаете решить с циклом ведь данные дергаются внутри foreach() Перенести цикл целиком в контроллер или как? Буду благодарен за дельные рекомендации.
ок я только за, как вы предлагаете решить с циклом ведь данные дергаются внутри foreach() Перенести цикл целиком в контроллер или как? Буду благодарен за дельные рекомендации.


Например так, так или вот даже так.
Каждый раз когда программист вручную экранирует в шаблоне какие-то данные умирает котенок. Потому что забыть забываются и пропускаются такие штуки на-раз.
Ситуация, когда вьюха получила уже экранированные данные тоже нередка.
Я конечно извиняюсь, но чем представленные вами «методы» отличаются от моего цикла в шаблоне?
Шорт теги дело вкуса, я не использую.
Sign up to leave a comment.

Articles