Передать статическую переменную в behavior

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Закрыто
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Передать статическую переменную в behavior

Сообщение nihaha »

Как в поведение передать статическую переменную класса?

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

class Photo extends ActiveRecord
{
    private static $types;

    public static function create($file, $title, $alt, $type): self
    {
        $photo = new static();
        ...
        self::$types = $type;
        return $photo;
    }

    public function behaviors()
    {
        print_r(self::$types);

        return [ 'поведение нарезки фоток' ];
    }
}
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передать статическую переменную в behavior

Сообщение zelenin »

зачем тут статика?
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

Я из другого места вызываю создание объекта как

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

Photo::create($file, $title, $alt, $type)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передать статическую переменную в behavior

Сообщение zelenin »

зачем статическая переменная нужна?
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

потому что если я сделаю переменную $types публичной и в методе create() присвою ей значение $photo->types = $type, то в behavior у меня приходит null
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передать статическую переменную в behavior

Сообщение zelenin »

nihaha писал(а): 2017.12.11, 15:12 потому что если я сделаю переменную $types публичной и в методе create() присвою ей значение $photo->types = $type, то в behavior у меня приходит null
эту проблему и надо было решать, а не статику городить.
в поведении можно получать доступ к модели через $this->getOwner()
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

ну я и попытался решить таким путем. справедливости ради замечу, что я нашел решение:
перед вызовом метода create(), устанавливаю значение этой переменной

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

Photo::$type = $type;
$photos[] = Photo::create($file, $title, $alt, $type);
после в поведении могу использовать ее как static::$type

Если это неправильно, прошу объяснить почему.
За подсказку по поводу $this->getOwner() спасибо.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передать статическую переменную в behavior

Сообщение zelenin »

nihaha писал(а): 2017.12.11, 15:46 ну я и попытался решить таким путем. справедливости ради замечу, что я нашел решение:
перед вызовом метода create(), устанавливаю значение этой переменной

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

Photo::$type = $type;
$photos[] = Photo::create($file, $title, $alt, $type);
после в поведении могу использовать ее как static::$type

Если это неправильно, прошу объяснить почему.
За подсказку по поводу $this->getOwner() спасибо.
потому что статику используешь для лечения бага, а статика в общем-то очень редко нужна.
А вот getOwner - это то что нужно в твоем случае.
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

И все же у меня никак не получается добиться желаемого и я не понимаю как мне достучаться до owner'a

Я переделал класс в вот такой:

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

class Photo extends ActiveRecord
{
    public $type;

    public static function create($file, $title, $alt, $type): self
    {
        $photo = new static();
        ...
        $photo->type = $type;
        return $photo;
    }

    public function behaviors()
    {
	return [
            [
                'class' => ImageUploadBehavior::className(),
                'attribute' => ($this->type == 'file') ? 'file' : 'gallery',
            ],
        ];
    }
}
но в $this->type у меня пустота, как я понимаю потому, что у меня проверяется $type текущего экземпляра класса, а не того, который я создал через $photo = new static().

Как мне правильно использовать данные из ранее созданного объекта?
Последний раз редактировалось nihaha 2017.12.12, 23:31, всего редактировалось 1 раз.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Передать статическую переменную в behavior

Сообщение caHek2x »

то что там types а в behaviors type это опечатка .. ?
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

Да, опечатка, сейчас поправлю
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передать статическую переменную в behavior

Сообщение zelenin »

nihaha писал(а): 2017.12.12, 21:42 И все же у меня никак не получается добиться желаемого и я не понимаю как мне достучаться до owner'a
внутри поведения $this-><getOwner()->type
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

дык это ж...
Calling unknown method ..... \Photo::getOwner()
то ли лыжи не едут
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Передать статическую переменную в behavior

Сообщение caHek2x »

может zelenin имеет ввиду внутри поведения ... а не метода behaviors ... но я не знаю, я предполагаю )
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Передать статическую переменную в behavior

Сообщение caHek2x »

https://yiiframework.com.ua/ru/doc/guid ... behaviors/
Tip: Внутри поведения возможно обращаться к компоненту, к которому оно прикреплено, используя свойство yii\base\Behavior::owner.
действительно :-)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передать статическую переменную в behavior

Сообщение zelenin »

caHek2x писал(а): 2017.12.12, 23:51 может zelenin имеет ввиду внутри поведения ... а не метода behaviors ... но я не знаю, я предполагаю )
да, "внутри поведения" действительно означает внутри поведения.
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

Так что мне чужое поведение править? я не въеду
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Передать статическую переменную в behavior

Сообщение zelenin »

nihaha писал(а): 2017.12.13, 00:15 Так что мне чужое поведение править? я не въеду
хотите чужое, хотите свое.
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Передать статическую переменную в behavior

Сообщение caHek2x »

ну переопределите чужое ... и в переопределенном сделайте нужные вам действия ... которые не делает это поведение ...
Аватара пользователя
nihaha
Сообщения: 95
Зарегистрирован: 2017.02.12, 13:30

Re: Передать статическую переменную в behavior

Сообщение nihaha »

caHek2x писал(а): 2017.12.13, 01:24 ну переопределите чужое ... и в переопределенном сделайте нужные вам действия ... которые не делает это поведение ...
Да вот только что так и сделал, все работает. Спасибо
Просто не сразу понял, что мне пытаются сказать
Закрыто