Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте!
Ситуация такая: приложение используется как Api для мобильного приложения и также как бэк для сайта. Ввиду этого у меня стоит 2 возможности авторизации (классическая через сессию и через токен passport для мобильного приложения).
На сайте есть некоторая логика на Vue, который также дергает API, чтобы получить какие-то данные.
Вопрос в том, как мне авторизовываться через Vue, чтобы измежать двойной работы (авторизация через сессию + потом еще получение токена через api)?
Можно ли как то в JS передать токен с бэка от авторизованного клиента?
Что-то вроде: window.axiosToken = {{$auth()->user()->token}}
Если быть занудой,
Мне нравится именно такой подход. Насчет примера с комментариями - это было использовано только для примера. В реальности данные меняются довольно часто и нужно их постоянно проверять. Тут дело в том, что я изначально еще не прочувствовал архитектуру 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)}} - будет ли повторный вызов в БД?
вернуть из контроллера ресурс.
Но мне же надо не вернуть ресурс, а вернуть view с передачей туда данных
Здравствуйте!
В контроллере получаю массив каких-то данные для отображения списка и далее в 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;
});
Это будет корректным решением или применяются другие подходы?
Здравствуйте!
В БД в таблице 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?
Здравствуйте!
Использую laravel + Vue с локализацией на стороне клиента. Валиадция формы на обеих сторонах. И вот мне нужно, чтобы стандартный валидатор Laravel возвращал не сообщение, а id ошибки, чтобы я потом по этому id на стороне клиента получил ошибку на нужном языке.
Подскажите, какие общепринятые варианты решения такой задачи?
Здравствуйте!
Запутался в понятиях. Мне нужны инструменты для сборки scss и ts.
В поиске выскакивает следующее: Webpack, Gulp, Elixir, Mix, Rollup. И я совершенно запутался. Они выполняют что-то слишком похожее...
Подскажите, что для чего используется?
Еще раз Большое Спасибо!
Итак, сделал как вы предлагали и все замечательно работает, но возник небольшой вопрос:
Я подключаю всего два файла - app.css и app.js, где абсолютно все скрипты и стили для всех маршрутов.
Есть у меня view - v1 и v2.
У одного скрипт делает alert("v1"), у второго alert("v2"). Но так как я разом подключаю все скрипты, то при любом маршруте вызовется оба Алерта.
Как решить такую проблему?
Помимо app.js создавать другие скрипты и вручную их подключать в нужных view? Или есть что то более красивое?
Большое Спасибо !
Здравствуйте!
Меня интересует как решить проблему нормальными общепринятыми способами и без костылей.
Пользователь проходит аунтификацию и во view попадает переменная $user со всеми данными о пользователе из БД.
Есть у меня JS скрипт, который должен отправить ajax запрос и ему нежны эти данные. Как их получить в JS.
(Вообще скрипты на typescript, но как мне кажется это суть дела не меняет)
Пока что нашел один выход - принудительное указывание приоритета, что мне не очень нравится.
Может есть что то еще?
Собственно, что я пока что делаю:
mix.scripts([
"../js/f1.js",
"../js/*.js"],"public/js/app.js");
Здравствуйте!
Никак не получается соединить файлы 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 ?
Большое спасибо за помощь!!!
нет. зависимости устанавливаются в resources/vendor и собираются вместе со скриптами и стилями сайта в один app.css и один app.js.
Спасибо большое за помощь! Вы очень точно описали все те проблемы, с которыми я столкнулся. Не многие могут так быстро понять проблему и помочь с решением, за что я Вам особенно благодарен
Но у меня получилось немного не так, как Вы сказали. Так как сторонние библиотеки не всегда в 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 ?
Здравствуйте!
Интересует меня два вопроса.
1)
Есть папка assets/sass в которой два файлика - _variables.scss и app.scss. Там начальные настройки. Отлично.
Как я понимаю, если мне нужно добавить свои файлы, то я импортирую их в app.scss и gulp их собирает в один файл.
Но вот, что мне не понятно: если у меня один раздел сайта требует одни стили, а другой раздел другие - то как мне распределить эту самую компиляцию и не цеплять лишние файлы? А то получается у меня независимо от раздела сайта всегда цепляются ВСЕ скрипты...
Писать для каждого файла свой путь? Что в таком случае делают?
2)
Если я хочу добавить какие то css от стороннего производителя, то я кладу их public/vendor, а затем в blade делаю
{{ asset('vendor/VendorNAME/style.css')}}
Это верный подход? Или для этого нужно в какую-то другую папку все складывать?
Спасибо за помощь!
}%А что именно делают общие методы?
Ну например, метод для доступа к удаленному серверу.
Его я юзаю из разных методов контроллеров, которые вызываются через ajax. Просто не удобно постоянно копировать метод, да и не очень то красиво. Вот я и узнаю как такое рода задачи решаются в ларавел?
Здравствуйте!
Вопрос немного странный.
У меня несколько контроллеров используют одни и те же методы. Я хочу вынести их в статический класс.
Куда в ларавеле кидают общие для контроллеров классы?
И как их подключают?
(Получается мне нужно что-то вроде дополнения\расширения\модуля)
по умному:
найди пакет на гитхабе, который авторизует по внешнему OAuth в ларе.
я уверен, что велик уже изобрели.
Да, есть пакеты, но они для всего, кроме twitch.
А мне нужен Twitch. Вот поэтому и спрашиваю)
Простите, что у Вас происходит?
Авторизация через OAuth. Далее я обращаюсь к серверу и по коду от OAuth проверяю привилегии пользователя. Именно ответ от сервера с передачей кода от OAuth решает зарегистрирован ли пользователь.
Если да - то сохраняю в куки специальный токен. По этому токену также можно стучать на сервер и узнавать авторизацию.
Здравствуйте!
Подскажите, если у меня аунтификация происходит без использования БД, то где писать собственную проверку на аунтификацию и другие методы??
Здравствуйте!
Проблема такая: Нашел много примеров для создания авторизации через стандартные логин-пароль-бд, но так и не получилось настроить OAuth.
Есть контроллер, все action которого требуют авторизации через twitch.
Как проверять авторизацию? Пробовал в конструкторе проверять значение куки (там хранится информация с сервиса oauth). Если они не найдены, то перенаправление на AuthController@getLogin, где идет редирект на oauth сервис с возвратом в getLoginCallback (сервис сюда в get передает токен, который я храню в куки). В этом звене записываю куки и опять перенаправление на нужный action уже с авторизацией.
Получилось как то запутанно. Что я делаю не так? (Да и браузер иногда ругается из-за перенаправлений)
Страницы 1