Laravel по-русски

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

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

#1 Laravel 6/7/8/9/10 » Multiple Auth guard » 05.12.2020 20:39:34

Kertis138
Ответов: 0

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

Ситуация такая: приложение используется как Api для мобильного приложения и также как бэк для сайта. Ввиду этого у меня стоит 2 возможности авторизации (классическая через сессию и через токен passport для мобильного приложения).

На сайте есть некоторая логика на Vue, который также дергает API, чтобы получить какие-то данные.
Вопрос в том, как мне авторизовываться через Vue, чтобы измежать двойной работы (авторизация через сессию + потом еще получение токена через api)?

Можно ли как то в JS передать токен с бэка от авторизованного клиента?
Что-то вроде: window.axiosToken = {{$auth()->user()->token}}

#2 Re: Laravel 6/7/8/9/10 » Как правильно получать данные подзапросов в коллекции » 25.08.2020 11:14:57

Если быть занудой,

Мне нравится именно такой подход. Насчет примера с комментариями - это было использовано только для примера. В реальности данные меняются довольно часто и нужно их постоянно проверять. Тут дело в том, что я изначально еще не прочувствовал архитектуру Laravel и поэтому путаюсь, какая часть системы за что отвечает.

Насчет вашего замечания к циклическим запросам. В правы - я перепишу запрос, который одной транзакцией получит все данные со всеми отношениями. Тут вопрос даже в другом - кто будет делать этот запрос (если говорить про масштабируемую архитектуру)? У меня есть общепринятая структура: Сервис -> Репозиторий -> Модель+БД.
Внедрение Сервиса происходит в контроллере (Репозиторий внедряется в сервис через интерфейс) и он получает одним запросом все данных. Во View приходит уже готовый массив - все верно?

На данном этапе у меня все получалось довольно красиво и без проблем.
А вот немного позже я начал путаться в следующем:

1) Если данные, которые передаются во View повторяются и я не хочу дублировать код в контроллере, то что делать? ViewComposer мне очень не нравится, потому что он передает зависимости неявно. Банальный пример - нужно передавать баланс пользователя в хедер, футер и во view layout.dashboard. Чтобы бы вы порекомендовали в таком случае делать? Только неявно передавать через ViewComposer? Или есть другие варианты, но которые не подразумевают написание Balance::get(Auth::id()) - во всех методах, где учавствуют нужные views. Я раньше с удовольствием делал через фасад и вызов метода сервиса прям в Blade - {{Balance::get(Auth::id())}} - все было бы хорошо, если бы не проблема дублирования (Если надо вывести баланс 2 раза - хедер и футер - то будет 2 обращения к БД).

2) И второе - появилась путаница в понятиях Репозитория и Laravel Model. В документации для создания отношений пишут методы прям в модели через hasMany, например. И в Blade я могу писать, что то типа - {{$user->comments}}, которая дергает метод comments(). А если мне надо после вывода всех комментарием внизу еще написать {{count($user->comments)}} - будет ли повторный вызов в БД?

#3 Re: Laravel 6/7/8/9/10 » Как правильно получать данные подзапросов в коллекции » 25.08.2020 10:11:41

вернуть из контроллера ресурс.

Но мне же надо не вернуть ресурс, а вернуть view с передачей туда данных

#4 Laravel 6/7/8/9/10 » Как правильно получать данные подзапросов в коллекции » 25.08.2020 06:21:46

Kertis138
Ответов: 7

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

В контроллере получаю массив каких-то данные для отображения списка и далее в foreach все это вывожу. Но в foreach помимо вывода атрибутов модели, также хочется выводить данные, которые есть результат нового запроса на основе данных текущей модели.
Приведу пример:

// CONTROLLER
$users = Users::where('active', true)->get();

//BLADE
@foreach($users as $user)
{{$user->name}}
...
{{$user->getCommentsCount()}}
@endforeach

В данном случае getCommentsCount - метод, который вернет количество всех комментариев пользователя, НО в BLADE некорректно использовать выборки + если нужно несколько раз вывести это значение, то придется два раза писать функцию и делать лишний запрос в БД.

Собственно вопрос, где должны происходить эти вычисления для преобразования коллекции?

В контроллере делать что-то вроде этого?

$users = Users::where('active', true)->get();
$users = $users.map(function($user) {
   $user->commentsCount = $user->getCommentsCount();
   return $user;
});

Это будет корректным решением или применяются другие подходы?

#5 Laravel 6/7/8/9/10 » Повторяющиеся вызовы к БД из провайдера » 24.08.2020 10:19:22

Kertis138
Ответов: 2

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

В БД в таблице user_balance хранится информация о балансе пользователя.

- Модель UserBalance
- Провайдер UserBalanceProvider
- Фасад Balance для Провайдера

К примеру, у меня в хедере должна появлятся информация о балансе + где то на отдельных страницах также она появляется уже в другом месте.
Сейчас для получения баланса я пишу в blade:

Balance: {{Balance::get()}}

Сам код получения баланса такой:

 function get() {
        if ($this->balanceCache != null) {
            return $this->balanceCache;
        }
        
        $balance = Balance::where('user_id', Auth::id())->first();
        if ($balance == null) {
            return $this->balanceCache = 0;
        }
        return $this->balanceCache = $balance->amount;
    }

Так вот, я использую balanceCache, чтобы при повторном вызове Balance::get не было повторящего запроса в БД. Но мне кажется, что это как-то очень некрсиво и неправильно. Как в Laravel будет правильнее обрабатывать повторный вызов метода для получения баланса в Blade?

#6 Laravel 6/7/8/9/10 » Валидация API » 05.04.2020 22:56:47

Kertis138
Ответов: 2

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

Использую laravel + Vue с локализацией на стороне клиента. Валиадция формы на обеих сторонах. И вот мне нужно, чтобы стандартный валидатор Laravel возвращал не сообщение, а id ошибки, чтобы я потом по этому id на стороне клиента получил ошибку на нужном языке.

Подскажите, какие общепринятые варианты решения такой задачи?

#7 Laravel 5.x » Сборка frontend » 25.02.2018 10:15:51

Kertis138
Ответов: 1

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

Запутался в понятиях. Мне нужны инструменты для сборки scss и ts.
В поиске выскакивает следующее: Webpack, Gulp, Elixir, Mix, Rollup. И я совершенно запутался. Они выполняют что-то слишком похожее...
Подскажите, что для чего используется?

#9 Re: Laravel 5.x » Elixir настройка » 18.02.2017 20:20:34

Итак, сделал как вы предлагали и все замечательно работает, но возник небольшой вопрос:
Я подключаю всего два файла - app.css и app.js, где абсолютно все скрипты и стили для всех маршрутов.

Есть у меня view - v1 и v2.
У одного скрипт делает alert("v1"), у второго alert("v2"). Но так как я разом подключаю все скрипты, то при любом маршруте вызовется оба Алерта.
Как решить такую проблему?
Помимо app.js создавать другие скрипты и вручную их подключать в нужных view? Или есть что то более красивое?

#11 Laravel 5.x » Javascript и получение данных » 13.02.2017 22:14:50

Kertis138
Ответов: 2

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

Меня интересует как решить проблему нормальными общепринятыми способами и без костылей.
Пользователь проходит аунтификацию и во view попадает переменная $user со всеми данными о пользователе из БД.
Есть у меня JS скрипт, который должен отправить ajax запрос и ему нежны эти данные. Как их получить в JS.

(Вообще скрипты на typescript, но как мне кажется это суть дела не меняет)

#12 Re: Laravel 5.x » Typescript и импорт файллов » 13.02.2017 20:37:35

Пока что нашел один выход - принудительное указывание приоритета, что мне не очень нравится.
Может есть что то еще?

Собственно, что я пока что делаю:

mix.scripts([
        "../js/f1.js",
        "../js/*.js"],"public/js/app.js");

#13 Laravel 5.x » Typescript и импорт файллов » 13.02.2017 20:25:12

Kertis138
Ответов: 2

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

Никак не получается соединить файлы typescript.
Для сборки использую laravel-elixir-typescript.

1) TS в TS

Допустим, есть файл f1.ts:

class A {
	Hello():void {
		console.log("hello");
	}
}

И есть файл f2.ts, в который мне надо подключить f1.ts

/// <reference path="f2.ts" />
var obj = new A();

В сборку включаю f1 + f2.
В таком случае ошибка: TypeError: A is not a constructor
ПРИЧЕМ я посмотрел в сгенерированный js - там реализация класса идет позже, чем вызов (Если вручную передвигаю его выше - все нормально).
Что я не так делаю? Может как то надо приоритет компиляции делать?
Как корректно подключать файл TS в TS ?

#15 Re: Laravel 5.x » Elixir настройка » 12.02.2017 12:12:26

constb пишет:

нет. зависимости устанавливаются в resources/vendor и собираются вместе со скриптами и стилями сайта в один app.css и  один app.js.

Спасибо большое за помощь! Вы очень точно описали все те проблемы, с которыми я столкнулся. Не многие могут так быстро понять проблему и помочь с решением, за что я Вам особенно благодарен smile
Но у меня получилось немного не так, как Вы сказали. Так как сторонние библиотеки не всегда в SCSS, пришлось разделить сборку на app.css + all.css. Аналогично получилось и с Typescript.

Typescript файлы импортирую в одном файле app.ts.
И потом в базовом шаблоне, от которого наследуются все другие подключаю 4 файла:

<link rel="stylesheet" href="{{elixir('css/all.css')}}">
<link rel="stylesheet" href="{{elixir('css/app.css')}}">
<script src="{{elixir('js/all.js')}}"></script>
<script src="{{elixir('js/app.js')}}"></script>

СОБСТВЕННО САМ GULP-ФАЙЛ

const elixir = require('laravel-elixir');
require('laravel-elixir-typescript');

elixir((mix) => {
    mix.sass('app.scss').version("css/app.css").version("css/app.css");
    mix.sass([
    	"../../../resources/vendor/animate.css",
    	"../../../resources/vendor/bootstrap-social.css",
    	"../../../resources/vendor/material-switch.css",
    	"../../../resources/vendor/buttons/scss/buttons.scss"],"public/css/all.css").version("css/all.css");

    mix.typescript('app.ts').version("js/app.js");
    mix.scripts([
    	"../../../resources/vendor/buttons/js/buttons.js"]).version("js/all.js");

	mix.copy('resources/images', 'public/images').version('public/images');
});

Все ли я правильно делаю?

Может можно это как то упростить и соединить в один файл?
И есть ли возможность сделать более красивый доступ к resources/vendor ?

#16 Laravel 5.x » Elixir настройка » 11.02.2017 00:50:27

Kertis138
Ответов: 7

Здравствуйте!
Интересует меня два вопроса.

1)
Есть папка assets/sass в которой два файлика - _variables.scss и app.scss. Там начальные настройки. Отлично.
Как я понимаю, если мне нужно добавить свои файлы, то я импортирую их в app.scss и gulp их собирает в один файл.
Но вот, что мне не понятно: если у меня один раздел сайта требует одни стили, а другой раздел другие - то как мне распределить эту самую компиляцию и не цеплять лишние файлы? А то получается у меня независимо от раздела сайта всегда цепляются ВСЕ скрипты...
Писать для каждого файла свой путь? Что в таком случае делают?

2)
Если я хочу добавить какие то css от стороннего производителя, то я кладу их  public/vendor, а затем в blade делаю
{{ asset('vendor/VendorNAME/style.css')}}
Это верный подход? Или для этого нужно в какую-то другую папку все складывать?

#18 Re: Laravel 5.x » Общие методы » 03.12.2016 20:41:24

AlexeyMezenin пишет:

}%А что именно делают общие методы?

Ну например, метод для доступа к удаленному серверу.
Его я юзаю из разных методов контроллеров, которые вызываются через ajax. Просто не удобно постоянно копировать метод, да и не очень то красиво. Вот я и узнаю как такое рода задачи решаются в ларавел?

#19 Laravel 5.x » Общие методы » 03.12.2016 20:30:16

Kertis138
Ответов: 4

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

Вопрос немного странный.
У меня несколько контроллеров используют одни и те же методы. Я хочу вынести их в статический класс.
Куда в ларавеле кидают общие для контроллеров классы?
И как их подключают?
(Получается мне нужно что-то вроде дополнения\расширения\модуля)

#20 Re: Laravel 5.x » Пользовательская аунтификация » 04.11.2016 20:29:49

hzone пишет:

по умному:
найди пакет на гитхабе, который авторизует по внешнему OAuth в ларе.
я уверен, что велик уже изобрели.

Да, есть пакеты, но они для всего, кроме twitch.
А мне нужен Twitch. Вот поэтому и спрашиваю)

#21 Re: Laravel 5.x » Пользовательская аунтификация » 04.11.2016 17:01:19

Androbim пишет:

Простите, что у Вас происходит?

Авторизация через OAuth. Далее я обращаюсь к серверу и по коду от OAuth проверяю привилегии пользователя. Именно ответ от сервера с передачей кода от OAuth решает зарегистрирован ли пользователь.
Если да - то сохраняю в куки специальный токен. По этому токену также можно стучать на сервер и узнавать авторизацию.

#22 Laravel 5.x » Пользовательская аунтификация » 04.11.2016 15:27:25

Kertis138
Ответов: 5

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

Подскажите, если у меня аунтификация происходит без использования БД, то где писать собственную проверку на аунтификацию и другие методы??

#23 Laravel 5.x » Laravel 5 OAuth Twitch » 29.10.2016 15:14:54

Kertis138
Ответов: 0

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

Проблема такая: Нашел много примеров для создания авторизации через стандартные логин-пароль-бд, но так и не получилось настроить OAuth.


Есть контроллер, все action которого требуют авторизации через twitch.
Как проверять авторизацию? Пробовал в конструкторе проверять значение куки (там хранится информация с сервиса oauth). Если они не найдены, то перенаправление на AuthController@getLogin, где идет редирект на oauth сервис с возвратом в getLoginCallback (сервис сюда в get передает токен, который я храню в куки). В этом звене записываю куки и опять перенаправление на нужный action уже с авторизацией.
Получилось как то запутанно. Что я делаю не так? (Да и браузер иногда ругается из-за перенаправлений)

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