Страница 1 из 3
Как заинжектить трейт в объект
Добавлено: 2017.04.21, 08:52
pistol
https://github.com/yiisoft/yii2/wiki/Pl ... r-versions - в YII планируется замена поведений на трейты.
А каким образом может быть проинжектен и отинжектен трейт для объекта? $object->attachTrait();? Такой же магией, что и с поведениями или есть какой-то более цивилизованный метод?
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 09:34
ElisDN
Никак.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 09:37
sosnovskiy
Вы почитали про трейты перед тем как задавать подобный вопрос.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 10:31
vitalik1183
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 10:40
ElisDN
Ну и как его налету приинжектить и отинжектить?
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 10:46
vitalik1183
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 10:57
zelenin
по ссылке хак для получения трейтоподобной функциональности на < 5.4 (на момент написания статьи 5.4 еще не вышла).
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 11:51
pistol
Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Всем спасибо.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 13:39
maleks
pistol писал(а): ↑2017.04.21, 11:51
Понял. Значит аттач работать будет старым способом, магией. Просто удалят behaviors() метод.
Из этого:
Try to use traits + events instead of behaviors and drop behaviors.
складывается больше ощущение что полностью поведения хотят удалить.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 14:08
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 из любого места системы. Только ценой магии и забивания гвоздей в гроб долговременной поддержки проекта, конечно)
Ну и
В конфиге - тоже ломовая фича для переноса повторяющегося опционального функционала. Вряд ли уберут вообще инжект поведений.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 16:24
zelenin
если поведения уберут, то как могут оставить их инжект?
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 18:23
pistol
Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.
Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 18:36
zelenin
pistol писал(а): ↑2017.04.21, 18:23
Поведения переименуют в трейты. Дропнут behaviors().
Если правильно это представляю, $this->owner возьмется из yii\base\Trait (вместо yii\base\Behavior), который будет заюзан из основного трейта.
Буду рад, если кто-то поправит и объяснит, можно ли так. С трейтами плотно не работал.
нельзя. трейты будут юзаться как трейты.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 18:54
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();
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 19:12
pistol
pistol писал(а): ↑2017.04.21, 18:54
сейчас проверю, насколько она присуща трейтам.
Вся магия работает также, как в классах.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 19:15
zelenin
это обычное использование трейтов. собственно трейты это именно это и есть.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 19:16
ElisDN
$this->owner в трейте не нужен. Трейт сам по себе не существует. Владелец - это сам $this.
pistol писал(а): ↑2017.04.21, 18:23
С трейтами плотно не работал.
Код из трейта через use вливается в класс также, как при include для файлов.
pistol писал(а): ↑2017.04.21, 19:12
Вся магия работает также, как в классах.
Трейт - это и всего лишь вынесенная запчасть от класса.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 19:19
pistol
ElisDN писал(а): ↑2017.04.21, 19:16
$this->owner в трейте не нужен. У трейта владелец - это сам $this.
pistol писал(а): ↑2017.04.21, 18:23
С трейтами плотно не работал.
Код из трейта через use вставляется в класс также, как include и require для кода файлов.
Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:
Или через Use вместо behaviors().
Если в документации будут рекомендовать юзать просто $this, то как заинжектить это в объект - не представляю.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 19:21
ElisDN
pistol писал(а): ↑2017.04.21, 19:19
как заинжектить это в объект - не представляю.
По-старому никак. Трейты - это просто импортируемые куски кода, а не объекты.
Re: Как заинжектить трейт в объект
Добавлено: 2017.04.21, 19:22
zelenin
pistol писал(а): ↑2017.04.21, 19:19Я все это веду к тому, что если будут использовать не $this, а $this->owner, то можно будет по-старому инжектить методы трейтов:
так как инжектить? пример выше - это обычное использование трейтов. там же нет динамического аттача.