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

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

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

Сообщение pistol »

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

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

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

Сообщение sosnovskiy »

Вы почитали про трейты перед тем как задавать подобный вопрос.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

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

Сообщение vitalik1183 »

ElisDN писал(а): 2017.04.21, 09:34Никак.
Да ну? :)
http://php.net/manual/en/language.oop5. ... visibility
Yii2!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

vitalik1183 писал(а): 2017.04.21, 10:31 Да ну? :)
Ну и как его налету приинжектить и отинжектить?
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

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

Сообщение vitalik1183 »

Что то похожее...
Yii2!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

vitalik1183 писал(а): 2017.04.21, 10:46 Что то похожее...
по ссылке хак для получения трейтоподобной функциональности на < 5.4 (на момент написания статьи 5.4 еще не вышла).
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

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

Сообщение pistol »

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

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

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

Сообщение maleks »

pistol писал(а): 2017.04.21, 11:51 Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Из этого:
Try to use traits + events instead of behaviors and drop behaviors.
складывается больше ощущение что полностью поведения хотят удалить.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

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

Сообщение pistol »

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 »

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

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

Сообщение pistol »

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

Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

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

Сообщение zelenin »

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

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

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

Сообщение pistol »

Проверил - вроде как можно.
Поведения 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 »

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

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

Сообщение zelenin »

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

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

Сообщение ElisDN »

$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 »

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
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

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

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

Сообщение zelenin »

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

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

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