Ответы пользователя по тегу Yii
  • Как в codecption создать stub для метода контроллера?

    onqu
    @onqu
    weasy
    В этом случае удобнее mock, но перед этим лучше проверить, что метод вообще вызывается. Stub хорош для полной замены чего-либо.

    // аргументы конструктора MyController
    $constructorArgs = [
        'id', 
        Yii::$app,
    ];
    
    // заменяемые методы и свойства MyController
    $methods = [
        // метод, который тестируем
        // подойдет любой тип callable
        'methodToTest' => function() {
            $args = func_get_args();
            
            ... тестируем аргументы
        },
    ];
    
    $controllerMock = \Codeception\Util\Stub::construct(
        '\namespace\controllers\MyController',
        $constructorArgs,
        $methods
    );
    $controllerMock->run('action', []);
    Ответ написан
    2 комментария
  • Как протестировать action в консольном контроллере yii2?

    onqu
    @onqu
    weasy
    Здравствуйте.

    public function testMyConsoleController()
    {
        $appConfig = [];
        $this->mockApplication($appConfig);
        
        $params = ['foo', 'bar'];
        $controller = new MyConsoleController('id', Yii::$app);
        $result = $controller->run('action', $params);
    
        $this->assertEquals(0, $result);
    }
    Ответ написан
    4 комментария
  • Какой массив должен быть в $model->load()?

    onqu
    @onqu
    weasy
    Ключом выступает имя класса модели.

    [
       'ИмяКласса' => [
            'id' => '2'
            'type' => '2'
            'date' => '12/01/2011'
        ]
    ]


    Или без указания оного
    $data = [
        'id' => '2'
        'type' => '2'
        'date' => '12/01/2011'
    ];
    
    // второй параметр - пустая строка
    $model->load($data, '');


    Или можно использовать любой свой ключ, но его необходимо также указать явно.
    $data = [
       'мой ключ' => [
            'id' => '2'
            'type' => '2'
            'date' => '12/01/2011'
        ]
    ];
    
    $model->load($data, 'мой ключ');
    Ответ написан
    1 комментарий
  • Где правильно установить переменную в сессии в Yii?

    onqu
    @onqu
    weasy
    Сделать сервис если эти данные будут нужны в дальнейшем, иначе листенер.

    если компонет - примерный конфиг
    return [
        'bootstrap' => [
            'mySubdomainComponent'
        ],
        'components' => [
            'mySubdomainComponent' => '\namespace\of\mySubdomainComponent'
        ]
    ];
    
    // обработка данных в компоненте, метод init
    ...
    
    // в дальнейшем можно получить компонент
    \Yii::$app->get('mySubdomainComponent')


    если listener - нужно добавить в bootstrap
    $app = \Yii::$app;
    $app->on($app::EVENT_BEFORE_REQUEST, ['myListener', 'method']);
    // в листенере делаем нужную обработку
    ...
    Ответ написан
    Комментировать
  • Как отфильтровать записи в модели перед выводом index?

    onqu
    @onqu
    weasy
    Любая модель в метод load ждет массив типа:
    [
        // имя класса без неймспейса
        'ModelSearch' => [
            ...
        ]
    ]


    Это поведение можно переопределить, но можно делать и так:
    $this->load($params, '');

    Вторым параметром мы скажем модельке, чтобы она искала атрибуты от корня массива.

    Подскажите, пожалуйста, как отфильтровать значения в модели (перед выводом в GridView) по параметру type? Т.е. когда никакие фильтры ещё не передаются.

    if (!$modelSearch->type) {
        $modelSearch->type = 'булехум!';
    }
    Ответ написан
    Комментировать
  • Почему проверка на duplicate не работает?

    onqu
    @onqu
    weasy
    Если это Yii2
    1. Вы вызываете валидацию 2 раза каждый раз.

    // первый
    $model->validate()
    
    // второй
    $model->save()

    Чтобы такого не было надо либо убрать прямой вызов validate, либо передавать false в вызов save.
    if ($model->validate() && $model->save(false)) 
       ...


    2. Нужно проверять, что вернул метод load
    if ($model->load($request->post()) && $model->save()) {
        // сохранили и что-то делаем
    }


    3. $_POST["email"] никогда не прилетит, если при выводе формы Вы делаете так:
    // $model instanceof Subscription
    $form->field($model, 'email')->textInput();

    то в $_POST прилетит:
    [
        'Subscription' => [
            'email' => 'some@email'
        ]
    ]


    4. Валидацию на уник можно сделать так
    public function rules()
    {
        return [
            ['email', 'unique'],
        ];
    }
    Ответ написан
    Комментировать