Yii терминология Слоистой архитектуры

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

Re: Yii терминология Слоистой архитектуры

Сообщение ElisDN »

samdark писал(а): 2020.08.31, 21:56 Всё обратно несовместимое в 2.0 не проходит. Обратно несовместимое — это про мажорную версию.
Вот про это и говорю, что Yii2 шесть лет заморожен архитектурно ввиду "Backward Compatibility" и два года заморожен функционально с "New features are no longer accepted", а Yii3 с этими новыми фичами ещё не вышел.

Так что на данный момент актуальной версии Yii в стадии Active нет.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Yii терминология Слоистой архитектуры

Сообщение samdark »

Ну если актуальная обязательно === та, куда фичи всё ещё добавляются, то да, так и есть.
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Yii терминология Слоистой архитектуры

Сообщение mihail_dev »

samdark писал(а): 2020.08.31, 21:56 Пока estimate конец 2020 — начало 2021.
Александр не надо оправдываться, я имею работу так как существует данный проект!
ElisDN писал(а): 2020.08.31, 19:28 В каком году выйдет 3.0?
Когда примерно зарелизится 3.1?
Дмитрий не надо разводит тут халивар! Пожалуйста!
uEhlO4a писал(а): 2020.08.30, 23:17 Если по существу, то если проект приносит деньги (и хорошую зп),
Спасибо за ваш комментарий!

Думаю что у меня ещё достаточно времени чтоб плавно перейти к текущим стандартам, проект не стабилен часто дорабатываем логику(фишки плюшки новые идеи)! Просто хочу начать этот процесс без остановки выпуска обновлений проекта!
Как сформирую моё виденье отпишусь пока собираю общее мнение и опыт в данном вопросе!
Изображение
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Yii терминология Слоистой архитектуры

Сообщение maleks »

Когда нибудь в будущем наверное придет момент и мы будем с ностальгией вспоминать время когда программировали на yii2. Да, не все по ООП, если вдаваться в теорию, но работа приносила удовольствие. И в старом проекте в котором, как у нас это принято без документации все, когда приходишь, раз и разобрался, т.к. код понятный только за счет своей простоты. Жаль что так получилось с этим фреймом.
mihail_dev писал(а): 2020.09.04, 15:49 чтоб плавно перейти к текущим стандартам
Вы про какие стандарты?
mihail_dev писал(а): 2020.09.04, 15:49 Как сформирую моё виденье отпишусь пока собираю общее мнение и опыт в данном вопросе!
Да, было бы интересно, если что то стоящее найдете.
Yii2 universal module sceleton - for basic and advanced templates
Аватара пользователя
mihail_dev
Сообщения: 243
Зарегистрирован: 2013.07.17, 00:51
Откуда: Молдова
Контактная информация:

Re: Yii терминология Слоистой архитектуры

Сообщение mihail_dev »

Много материалов перечитал и просмотрел!

в Yii2 сложно привести код к имеющимся стандартам малой кровью!

при всех обсуждениях пришли к тому что нам на данный момент важны несколько вещей:
1) стабильность проекта
2) тесты
3) понятный код
4) скорость выполнения работ
5) стоимость изменений

немного о некоторых пунктах и их значимостью:
1) стабильность проект - по идее это понятие очень зависит от тестов и тесты должны быть на первом месте но у нас много мест уже и так стабильных и на них нет тестов и переписывать в ближайшее время мы не собираемся!
2) понятный код и скорость выполнения работ - мы решили что понятный код нам важнее чем скорость выполнения так как в будущем это сильно влияет как на скорость разработки так и на стоимость

и так чтоб не терять в скорости работы мы решили что мы реализуем только сервисный слой который обнесём тестами!
отсюда следует что в AR не должно быть бизнес логики - фактически это дто с валидацией и связью с бд

сервисы мы реализуем 2 способами
1) когда сервис это модуль
2) классический вариант

немного кода
тест реферального модуля

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

<?php
use app\models\User;

class ReferralTest extends \Codeception\Test\Unit
{
    public function getReferalModule(): \app\modules\referral\Module
    {
        return Yii::$app->getModule('referral');
    }

    public function testApplyReferal()
    {
        $referralUser = User::find()->one();
        $buyerUser = User::find()
            ->where(['!=', 'id', $referralUser->id])
            ->andWhere(['referral_user_id' => null])
            ->one();

        $this->getReferalModule()->setCurrentReferralUserID($referralUser->id);

        $this->assertTrue($this->getReferalModule()->applyReferralUser($buyerUser));

        $this->assertEquals($referralUser->id, $buyerUser->referral_user_id);
    }

    public function testApplyReferalToUserWithReferal()
    {
        $buyerUser = User::find()
            ->andWhere(['>', 'referral_user_id', 0])
            ->one();

        $referralUser = User::find()
            ->where(['!=', 'id', $buyerUser->id])
            ->andWhere(['!=', 'id', $buyerUser->referral_user_id])
            ->one();

        $this->getReferalModule()->setCurrentReferralUserID($referralUser->id);

        $this->assertTrue($this->getReferalModule()->applyReferralUser($buyerUser));

        $this->assertNotEquals($referralUser->id, $buyerUser->referral_user_id);
    }
}

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

<?php
use app\models\User;
use Yii;

class CouponTest extends \Codeception\Test\Unit
{

    public function testMaxPriceExceeds()
    {
        $course = new \app\models\Courses([
            'price_1_new' => 10,
            'price_2_new' => 20,
            'price_3_new' => 30,
        ]);

        $coupon = new \app\models\Promocodes([
            'maxprice' => 15
        ]);

        $basketService = Yii::createObject(\app\components\services\interfaces\BasketServiceInterface::class);

        $basketService->clear();

        $basketService->setItem($course->getPrice(2), 1);

        try {
            $basketService->applyCoupon($coupon);
            $this->assertFalse(true);
        } catch (Exception $exception) {
            $this->assertFalse(!($exception instanceof \app\components\services\exceptions\CouponMaxPriceException), $exception->getMessage());
        }
    }

    public function testMaxPricePasses()
    {
        $course = new \app\models\Courses([
            'price_1_new' => 10,
            'price_2_new' => 20,
            'price_3_new' => 30,
        ]);

        $coupon = new \app\models\Promocodes([
            'maxprice' => 15
        ]);

        $basketService = Yii::createObject(\app\components\services\interfaces\BasketServiceInterface::class);

        $basketService->clear();

        $basketService->setItem($course->getPrice(1), 1);

        try {
            $basketService->applyCoupon($coupon);
            $this->assertTrue(true);
        } catch (Exception $exception) {
            $this->assertTrue(false, $exception->getMessage());
        }
    }
}
также нам понравилось писать в начале тесты
создавая интерфейс сервиса и только потом создавать рабочий вариант (меньше вопросов что должно получится, многие стали смотреть в тесты как на вспомогательный материал к заданию)


по итогу скорость работы фактически не пострадала
бизнес логика постепенно переходит в сервисный слой и обносится тестами
в данный момент это наш баланс разумного подхода к нашим проектам!
Изображение
Ответить