Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Phalcon PHP фрейморк. Работа с аннотациями

Anna | 31.05.2014 | нет комментариев

О Phalcon пока еще немного материалов, но фреймворк довольно увлекательный и заслуживающий внимания. Одно из увлекательных решений Phalcon — расширенные вероятности по применению аннотаций. Парсер написан на C, работает дюже стремительно. Разрешает легко и непосредственно перенести часть настроек (чуть ли не огромную часть) из конфигурационных файлов в код.

Часть I. Vivo (Стремительно).

Предназначение маршрутов в Phalcon достаточно «творчеcкая» задача.
Многие примеры пестрят различными методами назначения маршрутов.
На Прогре даже проскочил пример применения файлов xml…
И это в то время, когда многие фреймворки предлагают маршрутизацию посредством аннотаций.
А что же Phalcon?
Phalcon скромно и тихо указывает в документации, что допустима маршрутизация на аннотациях.
И что для этого авторы Phalcon легко сделали парсер аннотаций на C.
Впервой!
Что необходимо для включения аннотаций?
Каждого ничего.
В bootstrap файле внедряем сервис аннотаций, каждого несколько строк кода. И все.

...
	//set routers

	$di->set('router', function() {
		$router = new PhalconMvcRouterAnnotations(false);
        $router->removeExtraSlashes(true);
        $router->setUriSource(PhalconMvcRouter::URI_SOURCE_SERVER_REQUEST_URI);
        $router->addResource('Index');
        $router->notFound([
                          "controller" => "index",
                           "action"  => "page404"
        ]);
        return $router;
	});
...

Сейчас в маршруты (в том числе с префиксами), указываем прямо в контроллере.

...
  /**
   * @Post("/create")
   */
  public function createAction()
  {
	/...
  }
... 

Больше детально маршрутизация (типы запросов, пареметры) описана в документации.

Часть II. Presto (Стремительно, насколько допустимо)

Маршрутизация на аннотациях — это, безусловно, отлично. Но нам еще в планах доводится иметь дело с данными. И тут дозволено подметить одну специфика Phalcon.
При работе с базой данных он делает обыкновенно 3 запроса.
1-й проверяет присутствие таблицы в базе.
2-й получает метаданные таблицы.
3-й непринужденно запрос.
Не знаю, насколько это верно, не буду спорить. Но несколько неудобно.
Нам же 3 запроса ни к чему. Нам хотелось бы иметь метаданные таблицы где-то в загашнике.
В кэше, скажем.
И Phalcon того же суждения. Следственно предлагает сберегать метаданные в кэше. При этом дозволено применять аннотации.
Вновь DI, вновь botstrap:

...
	//Set a models manager
	$di->set('modelsManager', new PhalconMvcModelManager());

	//Set the models cache service
	$di->set('modelsCache', function() {

		//Cache data for one day by default
		$frontCache = new PhalconCacheFrontendData([
							"lifetime" => 86400
		]);
		$cache = new PhalconCacheBackendMemcache($frontCache, [
											"host" => "localhost",
											"port" => "11211",
											'persistent' => TRUE,
		]);
		return $cache;
	});

	$di->set('modelsMetadata', function() {

		// Create a meta-data manager with APC
		//$metaData = new PhalconMvcModelMetaDataApc([
		//         "lifetime" => 86400,
		//         "prefix"   => "general-phsql"
		//]);
		$metaData = new PhalconMvcModelMetaDataMemory([
											'prefix'  => 'general',
        ]);
		$metaData->setStrategy(new StrategyAnnotations());
		return $metaData;
	});
...

Позже чего, метаданные, считанные однажды, хранятся в кэш.
На время разработки мы можем переключиться на хранение в памяти.

Тут, в тезисе, все. Вновь же, больше детально в документации.

Что же, ничего ошеломительного в этих механизмах нет. За исключением того, что работает это дюже стремительно. Стремительно так, насколько это может быть достигнуто в компоненте, сделанном на C. То есть, фактически неприметно.
Но эти механизмы есть и у других фрейморков.
Нам же хочется чего-то вкусненького, какой-то изюминки…

Часть III. Prestissimo (Еще стремительней).

Вероятно, не секрет, что при проэктировании сайта доводится писать админку.!ds_lds_twomk!’, $element->getName(), ‘”>’, $element->getLabel(), ‘</label>’; echo $element; echo ‘</div>’; } echo $this->tag->endForm(); } }

Тут, при инициализации класса EntityForm мы считываем метаданные переданного объекта и его аннотации.
Позже этого внедряем все нужные поля в форму.
Функция renderform легко выводит нашу форму в браузер.

Возвратимся в контроллер, и сделаем действие итога формы:

...
  /**
   * @Get("/form")
   */
  public function formAction()
  {
    $myform = new EntityForm(new Users(), 'create');
    $this->view->setVars([
        'myform'  => $myform,
        ]);
  }
...

и получателя:

...
  /**
   * @Post("/create")
   */
  public function createAction()
  {
    echo '<pre>';
    var_dump($_POST);
    echo '</pre>';
  }
...

Остается только в образце итога (Volt) вывести форму:
<b>{{ myform.renderform() }}</b>
Вот и все.
Безусловно же, нужно добавить в класс формы CSRF-охрану, валидацию данных, сохранение.
Но задача этой статьи показать простоту и удобство применения аннотаций в Phalcon.
Эти вероятности предоставлены нам вследствие сильному и стремительному парсеру аннотаций PhalconPHP.
И, когда начинаешь применять Phalcon, понимаешь, что он подлинно стремителен.
И не только при итоге «Hello, world!».
Скорость и удобство работы с Phalcon подлинно удивляют.

index.php

<?php
use PhalconMvcViewEngineVolt;
use PhalconMvcModelMetaDataStrategyAnnotations as StrategyAnnotations;
try {
	//Register an autoloader
	$loader = new PhalconLoader();
	$loader->registerDirs([
				'../app/controllers/',
				'../app/models/',
				'../app/forms/'
	]);
	$loader->registerNamespaces([
				'Frontend\Model'  => __DIR__.'/../app/models/',
    ]);
	$loader->register();
	//Create a DI
	$di = new PhalconDIFactoryDefault();

	//Set a models manager
	$di->set('modelsManager', new PhalconMvcModelManager());

	//Set the models cache service
	$di->set('modelsCache', function() {

		//Cache data for one day by default
		$frontCache = new PhalconCacheFrontendData([
							"lifetime" => 86400
		]);
		$cache = new PhalconCacheBackendMemcache($frontCache, [
											"host" => "localhost",
											"port" => "11211",
											'persistent' => TRUE,
		]);
		return $cache;
	});

	$di->set('modelsMetadata', function() {

		// Create a meta-data manager with APC
		//$metaData = new PhalconMvcModelMetaDataApc([
		//         "lifetime" => 86400,
		//         "prefix"   => "general-phsql"
		//]);
		$metaData = new PhalconMvcModelMetaDataMemory([
											'prefix'  => 'general',
        ]);
		$metaData->setStrategy(new StrategyAnnotations());
		return $metaData;
	});

	//SQL profiler
	$di->set('profiler', function(){
		return new PhalconDbProfiler();
    }, true);
	//set database connection
	$di->set('db', function() use ($di) {
		$eventsManager = new PhalconEventsManager();

		//Get a shared instance of the DbProfiler
		$profiler = $di->getProfiler();

		//Listen all the database events
		$eventsManager->attach('db', function($event, $connection) use ($profiler) {
			if ($event->getType() == 'beforeQuery') {
				$profiler->startProfile($connection->getSQLStatement());
			}
			if ($event->getType() == 'afterQuery') {
				$profiler->stopProfile();
			}
		});

		$connection = new PhalconDbAdapterPdoMysql([
											"host" => "localhost",
											"username" => "root",
											"password" => "12345",
											"dbname" => "general"
		]);

		//Assign the eventsManager to the db adapter instance
		$connection->setEventsManager($eventsManager);

		return $connection;
	});
	//Register Volt as a service
	$di->set('voltService', function($view, $di) {
		$volt = new Volt($view, $di);

		$volt->setOptions([
			"compiledPath" => "../app/cache/",
        ]);

		return $volt;
	});

	//Setting up the view component
	$di->set('view', function(){
		$view = new PhalconMvcView();
		$view->setViewsDir('../app/views/');
		$view->registerEngines([
						".volt" => 'voltService'
        ]);
		return $view;
	});

	//Create Form manager
	$di->set('f_permark!   */
  public $indcode;
}

 

form.volt

<h2>Test form in Volt</h2>
<hr>
{{ myform.renderform() }}
<hr>

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB