Как заинжектить трейт в объект

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Как заинжектить трейт в объект

Сообщение pistol » 2017.04.21, 08:52

https://github.com/yiisoft/yii2/wiki/Pl ... r-versions - в YII планируется замена поведений на трейты.

А каким образом может быть проинжектен и отинжектен трейт для объекта? $object->attachTrait();? Такой же магией, что и с поведениями или есть какой-то более цивилизованный метод?


sosnovskiy
Сообщения: 239
Зарегистрирован: 2017.03.28, 20:03

Re: Как заинжектить трейт в объект

Сообщение sosnovskiy » 2017.04.21, 09:37

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

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Как заинжектить трейт в объект

Сообщение vitalik1183 » 2017.04.21, 10:31

ElisDN писал(а):
2017.04.21, 09:34
Никак.
Да ну? :)
http://php.net/manual/en/language.oop5. ... visibility
Yii2!

Аватара пользователя
ElisDN
Сообщения: 5417
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение ElisDN » 2017.04.21, 10:40

vitalik1183 писал(а):
2017.04.21, 10:31
Да ну? :)
Ну и как его налету приинжектить и отинжектить?

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Как заинжектить трейт в объект

Сообщение vitalik1183 » 2017.04.21, 10:46

Что то похожее...
Yii2!

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заинжектить трейт в объект

Сообщение zelenin » 2017.04.21, 10:57

vitalik1183 писал(а):
2017.04.21, 10:46
Что то похожее...
по ссылке хак для получения трейтоподобной функциональности на < 5.4 (на момент написания статьи 5.4 еще не вышла).

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение pistol » 2017.04.21, 11:51

Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.

Всем спасибо.

Аватара пользователя
maleks
Сообщения: 1764
Зарегистрирован: 2012.12.26, 12:56

Re: Как заинжектить трейт в объект

Сообщение maleks » 2017.04.21, 13:39

pistol писал(а):
2017.04.21, 11:51
Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Из этого:
Try to use traits + events instead of behaviors and drop behaviors.
складывается больше ощущение что полностью поведения хотят удалить.

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение pistol » 2017.04.21, 14:08

maleks писал(а):
2017.04.21, 13:39
pistol писал(а):
2017.04.21, 11:51
Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Из этого:
Try to use traits + events instead of behaviors and drop behaviors.
складывается больше ощущение что полностью поведения хотят удалить.
Будет жаль, если уберут. Хорошая фича, чтобы, например, быстро расширять геттеры для того же yii::$app->user из любого места системы. Только ценой магии и забивания гвоздей в гроб долговременной поддержки проекта, конечно)

Ну и

Код: Выделить всё

'as behaviorName' => [

]
В конфиге - тоже ломовая фича для переноса повторяющегося опционального функционала. Вряд ли уберут вообще инжект поведений.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заинжектить трейт в объект

Сообщение zelenin » 2017.04.21, 16:24

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

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение pistol » 2017.04.21, 18:23

Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.

Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заинжектить трейт в объект

Сообщение zelenin » 2017.04.21, 18:36

pistol писал(а):
2017.04.21, 18:23
Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.

Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
нельзя. трейты будут юзаться как трейты.

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение pistol » 2017.04.21, 18:54

Проверил - вроде как можно.
Поведения YII не так устроены сейчас?

UPD: убрал магию, сейчас проверю, насколько она присуща трейтам.

Код: Выделить всё

<?php

//Упрощенный yii::$app
class Yii
{
    public static $app = [];
}

//Упрощенный yii\base\Trait
trait YiiTrait
{
    function getOwner()
    {
        return Yii::$app['Obj'];
    }
}

//Пользовательский трейт
trait Tr
{
    use YiiTrait;

    function sum()
    {
        return $this->getOwner()->x + $this->getOwner()->y;
    }
}

//Пользовательский компонент
class Obj
{
    use Tr;
    
    public $x;
    public $y;
    
    public function __construct($x, $y)
    {
        $this->x = $x;
        $this->y = $y;
    }
}

//Инит приложения
Yii::$app = [
    'Obj' => new Obj(1, 2),
];

//Вызов метода из трейта, который использует $this->owner
echo Yii::$app['Obj']->sum();
Последний раз редактировалось pistol 2017.04.21, 19:12, всего редактировалось 1 раз.

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение pistol » 2017.04.21, 19:12

pistol писал(а):
2017.04.21, 18:54
сейчас проверю, насколько она присуща трейтам.
Вся магия работает также, как в классах.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заинжектить трейт в объект

Сообщение zelenin » 2017.04.21, 19:15

это обычное использование трейтов. собственно трейты это именно это и есть.

Аватара пользователя
ElisDN
Сообщения: 5417
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение ElisDN » 2017.04.21, 19:16

$this->owner в трейте не нужен. Трейт сам по себе не существует. Владелец - это сам $this.
pistol писал(а):
2017.04.21, 18:23
С трейтами плотно не работал.
Код из трейта через use вливается в класс также, как при include для файлов.
pistol писал(а):
2017.04.21, 19:12
Вся магия работает также, как в классах.
Трейт - это и всего лишь вынесенная запчасть от класса.

Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение pistol » 2017.04.21, 19:19

ElisDN писал(а):
2017.04.21, 19:16
$this->owner в трейте не нужен. У трейта владелец - это сам $this.
pistol писал(а):
2017.04.21, 18:23
С трейтами плотно не работал.
Код из трейта через use вставляется в класс также, как include и require для кода файлов.
Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:

Код: Выделить всё

$object->attachTrait();
Или через Use вместо behaviors().

Если в документации будут рекомендовать юзать просто $this, то как заинжектить это в объект - не представляю.
Последний раз редактировалось pistol 2017.04.21, 19:21, всего редактировалось 1 раз.

Аватара пользователя
ElisDN
Сообщения: 5417
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как заинжектить трейт в объект

Сообщение ElisDN » 2017.04.21, 19:21

pistol писал(а):
2017.04.21, 19:19
как заинжектить это в объект - не представляю.
По-старому никак. Трейты - это просто импортируемые куски кода, а не объекты.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заинжектить трейт в объект

Сообщение zelenin » 2017.04.21, 19:22

pistol писал(а):
2017.04.21, 19:19
Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:

Код: Выделить всё

$object->attachTrait();
так как инжектить? пример выше - это обычное использование трейтов. там же нет динамического аттача.

Ответить