Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Есть классы Домашнее_животное и Дикое_животное (производные от Животное).
Сейчас приходится наследственность Собаки и Кошки выглядит так:
class Домашнее_животное extends Животное{}
class Кошка extends Домашнее_животное{}
Есть классы Домашнее_животное и Дикое_животное (производные от Животное).
А вот чем xPDO лучше, например, моей любимой Doctrine или, скажем, Propel — ни слова не увидел.Не работал ни с одной, ни с другой. Но посмотрел этот мануал: propelorm.org/documentation/04-relationships.html
$author = new Author();
$author->setFirstName("Leo");
$author->setLastName("Tolstoy");
// no need to save the author yet
$publisher = new Publisher();
$publisher->setName("Viking Press");
// no need to save the publisher yet
$book = new Book();
$book->setTitle("War & Peace");
$book->setIsbn("0140444173");
$book->setPublisher($publisher);
$book->setAuthor($author);
$book->save(); // saves all 3 objects!
$book->fromArray(array(
'title' => $title,
'Isbn' => $Isbn,
));
Ручками эти методы писать не нужно — кодогенераторы по схеме БД или, емнип, генерация схемы по чему-тоМне этого уже достаточно для того, чтобы сказать, что xPDO лучше представленных ORM-ок, так как нет универсальности, а код разрастается.
Лично мне отдельные акцессоры для каждого поля больше нравятся — автодополнение в IDE, phpdocВ xPDO никто не ограничивает в этом. Своему объекту можно сколько угодно собственных методов прописать.
function setTitle($title){
return $this->set('title', $title);
}
setAuthor предполагает что связь один к одному. addOne этого не предполагает.Как раз очень даже предполагает. И это четко описывается в модели объекта. Если же для него связь прописана один-ко-многим, то используется метод ->addMany(), при чем в таком случае метод ->addOne() для него не выполнится.
Я должен ручками писать акцессоры для каждого из полусотни полей?В том-то и дело, что в xPDO этого вообще не требуется. Я всего-лишь показал, что при желании свои методы добавить всегда можно.
function set($field, $value){
switch($field){
case 'author':
$value = "Mr.(Ms.) {$value}";
break;
}
return parent::set($field, $value);
}
$id = 2; // ID медиасурса
// Получаем объект
$source = $modx->getObject('sources.modMediaSource', $id);
// Инициализируем
$source->initialize();
$url = $source->getObjectUrl('images/image.png');
public function initialize() {
parent::initialize();
$properties = $this->getPropertyList();
if (!defined('AWS_KEY')) {
define('AWS_KEY',$this->xpdo->getOption('key',$properties,''));
define('AWS_SECRET_KEY',$this->xpdo->getOption('secret_key',$properties,''));
/* (Not needed at this time)
define('AWS_ACCOUNT_ID',$modx->getOption('aws.account_id',$config,''));
define('AWS_CANONICAL_ID',$modx->getOption('aws.canonical_id',$config,''));
define('AWS_CANONICAL_NAME',$modx->getOption('aws.canonical_name',$config,''));
define('AWS_MFA_SERIAL',$modx->getOption('aws.mfa_serial',$config,''));
define('AWS_CLOUDFRONT_KEYPAIR_ID',$modx->getOption('aws.cloudfront_keypair_id',$config,''));
define('AWS_CLOUDFRONT_PRIVATE_KEY_PEM',$modx->getOption('aws.cloudfront_private_key_pem',$config,''));
define('AWS_ENABLE_EXTENSIONS', 'false');*/
}
include_once $this->xpdo->getOption('core_path',null,MODX_CORE_PATH).'model/aws/sdk.class.php';
$this->getDriver();
$this->setBucket($this->xpdo->getOption('bucket',$properties,''));
return true;
}
$repository = $this->getDoctrine()->getManager()->getRepository(Acme:Attachment);
// получаем объект
$attachment = $repository->find($id);
// сервис, который отвечает за логику работы с путями
$pathResolver = $this->get('acme.path_resoler');
$uri = $pathResolver->getFileUri($attachment->getUri());
$id = 2; // ID медиасурса
// Получаем объект
$source = $modx->getObject('sources.modMediaSource', $id);
// Инициализируем
$source->initialize();
$url = $source->getObjectUrl('images/image.png');
Получаем обсолютный путьЭто пять!
однако многие ведущие разработчики опасались, что типажи будут использоваться не по назначению.
trait ObjectManager
{
protected $manager;
public function setObjectManager (ObjectManager $manager)
{
$this->manager = $manager;
}
protected function getObjectManager()
{
return $this->manager;
}
}
<?php
trait Foo {
function __construct() { echo "Foo::__construct()\n"; }
}
trait Bar {
function __construct() { echo "Bar::__construct()\n"; }
}
class FooBarClass {
use Foo, Bar {
Foo::__construct as initFoo;
Bar::__construct as initBar;
}
public function __construct() {
echo "FooBarClass::__construct() {\n";
$this->initFoo();
$this->initBar();
echo "}\n";
}
}
$objFooBar = new FooBarClass();
?>
services:
MyService:
class: NS\MyBundle\Service\MyService
calls:
- [ setObjectManager, [ @doctrine.orm.entity_manager ] ]
def decorate(func):
def world(*args, **kwargs):
func(*args, **kwargs)
print "World"
return world
class Decorated:
@decorate
def speak(self):
print "Hello"
test = Decorated()
test.speak = decorate(test.speak)
test.speak()
class Decorated:
@decorate
def speak(self):
print "Hello"
Python 3 не используется
This is interesting enough so I'll make a translation for those who do not speak Russian
as well.
David points out that mbstring.func_overload, which enables standard PHP string functions
to work OK with UTF-8, might be causing troubles with sphinxapi.php which uses strlen()
when forming request.
He also suggests a fix to sphinxapi.php which would check that and temporarily switch the
encoding to latin1. (which I suppose fixes strlen())
JsonSerializable и трейт с реализацией этого интерфейса. Профит. После этого можно любую сущность заворачивать в REST-интерфейс одним контроллером.I also fear that it may fall into the category of often-abused-features such as eval(), goto, constants, the @ operator, class inheritance and regular expressions.
Проблымы появились тогда, когда я добрался до компонентов Изображение и ИзображениеКнопка. По сути ИзображениеКнопка дочерняя сущность от сущности Кнопка, т.к. есть обработчик нажатия, но в ней есть еще описание и весь функционально компонента Изображение, т.к. полностью повторяет функционально и Кнопки и Изображения! Тут я и воспользовался возможностями примесей.IMHO композиция кнопки и изображения выглядело бы здесь более логичным решением.
Типажи в PHP: хорошо это или плохо?