LINUX.ORG.RU

PHP + MondoDB = Сохранение и загрузка классов

 , ,


0

1

Начитался паттерна Data-Mapper.

У меня в программе есть классы, представляющие сущности системы вроде Пользователь (содержит ссылку на Аккаунт), АккаунтПользователя, Сервисы (содержат ссылку на аккаунт)

class objectUser {
	private $fio = null;
	private $role = null;
	private $username = null;
	private $password = null;
	private $salt = null;
	private $hash = null;
	private $account = null;
	private $services = Array();

	public function getFio() {
		return $this->fio;
	}

	public function setFio($_fio) {
		if (!validator::nameRuEn100($_fio)) {
			AppLogger::instance()->warning("objectUser::setFio() попытка установить невалидное имя", $_fio);
			return false;
		}
		$this->fio = $_fio;
		return true;
	}

	
	public function setAccount(objectAccount $_account) {
		if ($_account->is_complete() === true) {
			$this->account = $_account;
			return true;
		}
		AppLogger::instance()->warning("попытка установить незаконченный аккаунт", $_account);
		return false;
	}
	
	public function getAccount() {
		return $this->account;
	}

	// и еще куча геттеров-сеттеров

	// вызываем перед сохранением в базу
	public function is_complete() {
		if ( ($this->fio == null) ||
			 ($this->role == null) ||
			 ($this->username == null) ||
			 ($this->password == null) ||
			 ($this->salt == null) )
			return false;
		return true;
	}
	
	// Вызываем для сохранения в базу объектом userMapper
	public function getMongoStruct() {
 		$obj = Array();
		$obj['fio'] = $this->getFio();
		$obj['role'] = $this->getRole();
		$obj['username'] = $this->getUsername();
		$obj['password'] = $this->getPassword();
		$obj['salt'] = $this->getSalt();
		$obj['enabled'] = $this->getEnabled();
		$obj['hash'] = $this->getHash();
		if ($this->getAccount() != null)
			$obj['account'] = $this->getAccount()->getMongoId();
		else
			$obj['account'] = null;
 		return $obj;;
	}
	
}

И так в каждом классе. И еще столько же классов Мапперов. Код-то по сути одинаковый.

И у меня возникает ощущение, что я делаю чужую работу. Что всё это делается какой-нибудь простой библиотекой или небольшим фреймворком.

Что я просто могу просто задекларировать какие поля есть в объекте который нужно сохранить, какого они должны быть типа, длины, какой валидатор им применять и методы геттеры/сеттеры/is_complete появятся сами.

А как вы решаете вопрос хранения объектов в ваших суперских (или не очень) приложениях?


Ответ на: комментарий от anonymous

lmgify: http://mandango.org/

Смотрел, выглядит страшно. Ты использовал её?

Она может хранить ссылки на другие классы и корректно их сохранять в базу (сохранять ID-шник)?

zekka ()

И у меня возникает ощущение, что я делаю чужую работу

Это называется ORM. Когда система сама осуществляет загрузку и сохранение данных объектов из/в БД. Какие готовые ORM под Монгу есть — не знаю. Сам только экспериментировал слегка и с собственным ORM (во, аж 4 года уже прошло: https://github.com/Balancer/bors-core/blob/master/classes/bors/storage/mongo.php )

Я бы искал так:
https://libraries.io/search?languages=PHP&q=mongodb orm

И так:
https://packagist.org/search/?q=mongodb orm

Скорее всего, надо смотреть или на один из модулей к Doctrine (что громоздко и сложно), либо на что-то типа https://github.com/purekid/mongodm

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

https://github.com/purekid/mongodm

Вот эта после беглого осмотра уже нравится.

Но первое чего боюсь - вдруг автор бросит разработку? Все-таки не очень большой проект, последний коммит 30марта.

Врожденный страх тянет писать велосипед... =(

zekka ()

MondoDB
Пользователь (содержит ссылку на Аккаунт)...Сервисы (содержат ссылку на аккаунт)

Откуда ж вы берётесь то?!

ya-betmen ★★★★★ ()
Ответ на: комментарий от umren

Меня забавляют посты школьников, которые ссылаются на говностатьи с enterprisedb или стартапа который не смог прочитать что такое schemaless и знают больше чем, например, Viber который в своё время юзал mongo с redis.

Я не агиритую за какую-либо субд, нужно понимать что нужно использовать в каком случае, но эти школьники иногда бесят :D

invokercd ★★★★ ()
Последнее исправление: invokercd (всего исправлений: 1)
Ответ на: комментарий от zekka

Если не комплексуеш по поводу использования комплексных решений, бери symphony и doctrine. Найдеш причины чем тебе doctrine-mongodb не угодит, смотри в сторону mandango.org

anonymous ()
Ответ на: комментарий от zekka

Но первое чего боюсь - вдруг автор бросит разработку?

Так опенсорс же :)

Но первое чего боюсь - вдруг автор бросит разработку?

Тут за тебя уже написали его. Если автор забросит, а тебе позарез придётся что-то добавить или исправить, всегда сам поправить сможешь — это не то же самое, что с нуля писать. Плюс, если грамотно интерфейс строить, потом всегда можно сменить бэкенд на другой с минимальной переделкой своего кода.

последний коммит 30марта.

Вот если пару лет назад — тогда вызывает опасения :)

Тут больше надо смотреть на то, что в проекте 10 контрибьютеров. Значит вполне себе код востребованный и в случае закрытия может быть кем-то форкнут.

Но это всё теория, сам я этим пакетом не пользовался и только для примера привёл.

KRoN73 ★★★★★ ()
Ответ на: комментарий от Deleted

схема может быть реализована и в виде документа, тут уже простор для фантазии. Главное не прогадать, если апп будет расширяться.

invokercd ★★★★ ()
Ответ на: комментарий от invokercd

схема может быть реализована и в виде документа,

Ты оказывается такойже как и те кого ты ненавидишь 8)

Deleted ()
Ответ на: комментарий от Deleted

Я всех люблю, по-своему :)

На сайте монги в примерах есть реализация нескольких таблиц в одном документе. Если это возможно сделать красиво, то это абсолютно не костыльно, но требует переделывания аппа (что в принципе справедливо для nosql в целом)

invokercd ★★★★ ()
Ответ на: комментарий от invokercd

нескольких таблиц в одном документе.

это возможно сделать красиво, то это абсолютно не костыльно

Пушистая лиса тебя подери, ты приводишь пример натягивания совы на глобус таблиц на документоориентированную бд и радуешься как это красиво. Ты либо извращенец и тебе такие вещи нравятся, либо просто не понимаешь что монга вообще не для этого.

Deleted ()
Ответ на: комментарий от Deleted

Вообще то я ТС не советовал юзать монгу, ты что-то путаешь. А монга просто для хранения документов в виде json, кто-куда её суёт - личное дело каждого.

invokercd ★★★★ ()
Ответ на: комментарий от Deleted

действительно монга не нужна

Схема есть, но всё-такие плавающая и монга мне вполне подходит. Простой пример - в качестве value иногда используется массив с неизвестным заранее количеством элементов. А процесс нормализации sql-таблиц мне не нравится и всегда казался ужасным.

Или я неправ? Мне производительность вообще не критична.

zekka ()
Ответ на: комментарий от anonymous

Еще раз взглянул на doctrine. А разве symphony прибит к нему гвоздями? Вообще не нашел упоминаний.

zekka ()
Ответ на: комментарий от Deleted

схема - это абстракция, я под схемой подразумеваю неизменную структуру документа в коллекции, а не конкретно реляционную структуру. Хотя монга даёт возможность в одну коллекцию записывать разную структуру документа - это не есть хорошо, вот когда структура неизменна - это и есть схема (для этого и ODM сущестует, когда модель основана на схеме а не на тяп-ляп структуре)

invokercd ★★★★ ()
Последнее исправление: invokercd (всего исправлений: 1)

А как вы решаете вопрос хранения объектов в ваших суперских (или не очень) приложениях?

  • Пишу на языках программирования, а не на PHP.
  • Юзаю ORM
cherry-pick ()
Ответ на: комментарий от KRoN73

Сам только экспериментировал слегка и с собственным ORM (во, аж 4 года уже прошло: https://github.com/Balancer/bors-core/blob/master/classes/bors/storage/mongo.php )

Т.е. вам комфортно писать вот такой вот код ?

class bors_storage_mongo extends bors_storage

Вот эта вот первая строчка мне уже выносит мозг. Если далее вы пишете

$m = new Mongo();
То почему бы и свой класс не оформлять как надо ?
class BorsStorageMongo extends BorsStorage

p.s. я надеялся, даже иногда был уверен, что в php тоже наконец-то появятся программисты, а не быдлокодеры как сейчас. но увы и нет.

abc ()
Ответ на: комментарий от abc

Т.е. вам комфортно писать вот такой вот код ?

Этому коду 5 лет. А движку — где-то под 18 :)

Если далее вы пишете

Так использование стандартного класса.

То почему бы и свой класс не оформлять как надо ?

Во-первых, если писать полные имена, то я сторонник snake_style, а не CamelCase.

Во-вторых, если уже «как надо», то сегодня всё это пишется в namespaces. И если этот код переписать как надо, то будет class Mongo extends Meta всё в рамках package Bors\Storage;.

Во-третьих, есть такое понятие, как legacy и поддержка левохостингов. Я поддержку кодировок, отличных от utf-8 только в этом году выпиливать начал, чего уж про namespaces говорить, которые только в php-5.3 появились, а его поддержка только сейчас закончилась :) Соответственно, фичи php-5.3 только сейчас и начинаю использовать в общем коде. Что не означает, что в узких целевых проектах не используются возможности php-5.4 или -5.5...

KRoN73 ★★★★★ ()
Ответ на: комментарий от zekka

Производительность тут никаким боком. А тебе обычно нужна целостность (в т.ч. ссылочная) данных.

Deleted ()
Ответ на: комментарий от KRoN73

Во-первых, если писать полные имена, то я сторонник snake_style, а не CamelCase.

Мда, понятно. Вообще то даже ваш родной PSR гласит: «Class names MUST be declared in StudlyCaps.»

Но вам же удобнее так... В этом весь PHP что тут сказать. И не важно сколько этому коду лет.

В 2005 когда я сел за C# я писал сразу с соблюдением стандарта написания кода, хотя там можно было переменные русскими именами на кириллице писать,да.

abc ()
Ответ на: комментарий от abc

Вообще то даже ваш родной PSR гласит

PSR — это новомодное веяние недавнего времени :) Конечно, придётся на него ориентироваться, но это не отменяет 25 лет snake_style :)

В этом весь PHP

Ой, давайте ещё спорить, табы или пробелы использовать в Питоне и держать открывающуюся фигурную скобку в конце предыдущей или в начеле новой строки в Си/Java. При чём тут PHP?

В 2005 когда я сел за C# я писал сразу с соблюдением стандарта написания кода

Ну да, это ж буквально вчера. Вот попишите на полутора десятках языков разных концепций в течении хотя бы 20 лет — тогда и обсудим этот вопрос :D

хотя там можно было переменные русскими именами на кириллице писать,да

Сегодня, наверное, проще перечислить, где такое делать _нельзя_... Нашли на что сослаться :)

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Ну да, это ж буквально вчера. Вот попишите на полутора десятках языков разных концепций в течении хотя бы 20 лет — тогда и обсудим этот вопрос :D

Вы не представляете, но разработкой я занимаюсь аж с 1997 года. И да я писал на куче разных языков.

abc ()
Ответ на: комментарий от abc

Вы не представляете, но разработкой я занимаюсь

Тогда я удивлён Вашей озабоченностью стилем именования. Этот стиль редко бывает общепризнан и меняется периодически даже в рамках одноязыкового мейнстрима. Это, вообще, холиворная тема вкусовщины.

О вкусах можно спорить, но глупо свой вкус считать единственно верным.

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Это, вообще, холиворная тема вкусовщины.

Да это не вкус, это стандарт!

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

abc ()
Ответ на: комментарий от abc

Да это не вкус, это стандарт!

Экая у вас в голове каша.

1. PSR — это не стандарт. Это рекомендация. «Proposing a Standard Recommendation».

2. Судя по всему, Вы не знакомы с psr-0.

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

Ну, кто ж виноват, что у Вас такой слабый мозг. А, говорите, с 1997-го в программировании. Неужели до сих пор не видели языков, где норма — snake_style?

Вообще, Вы устроили истерику на ровном месте и по чисто холиворному вопросу. Спокойнее нужно быть, это не порядок, когда у Вас мозг на ровном месте взрывается...

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Ну, кто ж виноват, что у Вас такой слабый мозг. А, говорите, с 1997-го в программировании. Неужели до сих пор не видели языков, где норма — snake_style?

Видел. Только в этих языках snake_case относится к экземплярам классов, а не к определению классов.

Вообще, Вы устроили истерику на ровном месте и по чисто холиворному вопросу.

Это очень серьезный вопрос. Отсюда в PHP столько «специалистов» появляется. Где каждый думает, я тут не будут так писать буду вот так. Потому что мне так больше нравится. Тут я класс объявлю в snake style, а следующий класс CamelCase.

В итоге когда проект переходит за over 100 000 строк кода, читать его другой команде разработчиков становится очень сложно.

И да, на счет

Ну, кто ж виноват, что у Вас такой слабый мозг

Я вас не оскорблял, а вы тут сразу на личности переходите. Типичный способ защиты когда нет аргументов.

abc ()
Ответ на: комментарий от abc

Видел. Только в этих языках snake_case относится к экземплярам классов, а не к определению классов.

Это только в последние годы.

Я вас не оскорблял

Да ладно, ворвались в мирный тред и начали учить жизни «быдлокодеров на PHP». Ваши посты насквозь пропитаны высокомерием и хамством.

Типичный способ защиты когда нет аргументов.

Я ж не виноват, что Вы их старательно игнорируете. Но если хотите, я могу повторить встречный вопрос (и это только один из ряда аргументов, озвученных выше). Вы слышали о psr-0?

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Ваши посты насквозь пропитаны высокомерием и хамством

okay.

abc ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.