Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Laravel api не работает » 12.11.2017 17:36:18

nginx в директиве server: root /usr/share/nginx/html/test/public/;

Обязательно в конце указывать /

#2 Laravel 5.x » Laravel api не работает » 12.11.2017 14:44:28

VasiliyKoshelev
Ответов: 1

Добрый день! Подскажите, пожалуйста, не могу разобраться.

Ситуация такая: есть приложение на laravel. Работает морда, при переходе на http://192.168.0.101/test/public вижу её. Добавлен маршрут в api. При переходе на http://192.168.0.101/test/public/index.php/api/v1/tests получаю 404

Если запустить php artisan serve —host 0.0.0.0 то все работает на порту 8000: и апи http://192.168.0.101:8000/api/v1/tests и морда http://192.168.0.101:8000/

В чем косяк? Не могу найти как сделать, чтобы апи работало без php artisan serve —host 0.0.0.0

сервер nginx, php v7.0.25, сервер на виртуальной машине centos 7

#3 Re: Laravel 5.x » phpunit и mysql » 09.10.2017 16:18:26

Итак, все перепроверил, поправил и по итогу время выполнения одних и тех же тестов (6 из 80) выполняется теперь за 25 сек, вместо 35 сек.
@Baldal, спасибо!

Может быть, еще можно как-то ускорить процесс?

#4 Re: Laravel 5.x » phpunit и mysql » 09.10.2017 14:24:19

Для таблиц тестовой БД можно использовать MEMORY storage engine.

А есть какие-либо мануалы по этой теме?
Ну, то есть, я попробовал у всех таблиц указать $table->engine = 'MEMORY';
Потом изменил везде типы text на varchar, потому что не поддерживаются blob/text
Потом урезал где данные больше 255 символов
И все равно получил левые ошибки там, где раньше они не возникали, например, связанные с аутентификацией.

Буду копать, спасибо.

#5 Laravel 5.x » phpunit и mysql » 09.10.2017 13:51:41

VasiliyKoshelev
Ответов: 3

Здравствуйте!

Для прогона тестов использую phpunit.
Использовал с sqlite - все было отлично, тесты выполнялись быстро. Но с усложнением запросов столкнулся с надобностью перейти с sqlite на mysql, т.к. sqlite не поддерживала некоторый синтаксис запросов, из-за чего тесты стали бесполезными.
С реальной бд mysql скорость запросов очень сильно упала, т.к. как я понимаю, перед каждым тестом laravel дропает все табилицы с тестовым набором и создает их заново.

Подскажите, пожалуйста, как можно ускорить процесс тестирования?
Спасибо!

#6 Re: Laravel 5.x » Нужно, чтобы пользователь видел только свои экземпляры сущностей » 07.06.2017 11:38:38

Bender, спасибо за ответ!

Сейчас все решения, что у меня есть сводятся к одному: добавлять join к каждому запросу для получения нужного результат.
Если честно, думал, что есть более элегантные и "правильные" решения этому вопросу.

Спасибо за наводку, прочитаю так же про global scope.

#7 Laravel 5.x » Нужно, чтобы пользователь видел только свои экземпляры сущностей » 06.06.2017 17:11:41

VasiliyKoshelev
Ответов: 2

Здравствуйте!

Схема приложения такая: имеются пользователи, которые создают кампании. У кампании есть зависимые сущности. Например, компания имеет офис, офис связан с заказом. Заказ связан с исполнителем, который напрямую связан с компанией.

Как правильно сделать так, чтобы авторизованный пользователь видел только свои экземпляры сущностей?
Например, вывести все заказы исполнителя такого-то.

Усложняет все тот момент, что сущностей много, все методы и взаимодействие уже прописано. Как решить этот вопрос с наименьшими временными потерями и не нарушить архитектуру?

Архитектура приложения простая:
контроллеры -> бизнес-слой -> репозитории -> модель

#8 Laravel 5.x » Каким образом правильно построить логику работы контроллера? » 02.04.2017 16:49:16

VasiliyKoshelev
Ответов: 1

Laravel Framework 5.4.11
PHP 7.0.14-2+deb.sury.org~xenial+1
Zend OPcache v7.0.14-2+deb.sury.org~xenial+1
Centos 7
MySQL 5.5.54-0+deb8u1
Apache/2.4.10 (Debian)

Здравствуйте!
Для решения задачи привожу структуру взаимодействия контроллеров и бд:
Контроллер (получение входных данных и передача в бизнес-слой) -> слой бизнес-логики (все действия над входными данными и запросы к модели) -> модель

Итак, стоит задача: при создании нового объекта сущности (методы которой находятся в контроллере) создавать 2 соответствующие записи в других БД.
Конкретно - имеется контроллер OfficeNumbers, при создании нового создать запись в БД asterisk и kamailio.

Сейчас делаю так:
в контроллере делаю
1.запрос на создание записи
2.запрос на создание записи в бд asterisk и kamailio

В бизнес-слое:
1. подключаю модели таблиц бд asterisk и kamailio, providers
2. Получаю список необходимых параметров из модели providers
3. Делаю необходимые вычисления и записываю данные через модель в бд asterisk и kamailio

Вопрос: как грамотно сделать так, чтобы при возникновении проблем с добавлением в одну из таблиц отменялись изменения во всех затронутых таблицах и вообще уместны ли такие действия?

То есть, понимаю, что нужно использовать транзакции, но нашел примеры с использованием транзакций при запросах непосредственно напрямую к БД. Притом интересует, правильно ли разделил действия, либо нужно было в контроллере выполнить один запрос на создание данных, а уже внутри этого запроса делать вставку записей в asterisk и kamailio

В контроллере:

        $arUpdate = Array(
            // какие-то поля
        );

        if (!$arResult['id'] = $this->businessLayer->getIdFromUpdate($arUpdate))
        {
            throw new ApiException("Error INSERT OfficeNumber");
        }

        if (!$arResult['insert_to_asterisk'] = $this->businessLayer->getIdFromUpdateOffNum($arUpdate))
        {
            throw new ApiException("Error INSERT OfficeNumber to asterisk/kamailio");
        }

В бизнес-слое:

public function getIdFromUpdateOffNum($arUpdate)
    {
        $providers_model     = new ProvidersModel();
        $providers_repository= new ProvidersRepository($providers_model);

        $asterisk_model      = new AsteriskSipfriendsModel();
        $asterisk_repository = new AsteriskSipfriendsRepository($asterisk_model);

        $kamailio_model      = new KamailioUacRegsModel();
        $kamailio_repository = new KamailioUacRegsRepository($kamailio_model);

        if (count($arProviders = $providers_repository->getById($arUpdate['provider_id']))) {
            $arParameters = json_decode($arProviders['config'], true);

            if ($asterisk_repository->getIdFromUpdate($arParameters))
            {
                if ($arProviders['require_reg'] == 'yes') {
                    $arCamailioUpdate = Array(
                        //какие-то параметры
                    );

                    return $kamailio_repository->getIdFromUpdate($arCamailioUpdate);
                }
                return true;
            }
            return false;
        }
        return false;
    }

В данный момент все работает, интересует именно как сделать правильно.
Спасибо!

Подвал раздела