Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Ну и как отзывы по поводу mpdf/mpdf ? Как он дружит с tailwind css ???
mpdf дает базовые возможности по стилевому оформлению. со сложными правилами он может не справиться.
зато он самодостаточен, не надо ни nodejs, ни headless chrome
здесь не видно как вы их помещаете в сторадж. очевидно что удаление должно быть реализовано как-то подобно добавлению, вероятно в том же сервисном классе.
Throwable является предком Exception поэтому у вас тут очевидное дублирование.
Кто нибудь использовал связку Laravel spatie laravel to pdf ?
нет. я использую mpdf/mpdf, но понимаю как работает spatie/laravel-pdf - обращается к локально установленному npm пакету с Chrome внутри.
Думаю если следовать инструкции по установке пакета и зависимостей, то всё будет ОК. ошибка говорит о том, что headless Chrome не находит необходимых библиотек.
https://github.com/puppeteer/puppeteer/ … snt-launch
childs ))) мн. число от child это children
конечно этот метод не может работать. то что ты пытаешься кешировать, это не набор строк, а некое правило eloquent, которое он использует внутри себя для формирования запросов.
кешировать ты можешь результат запроса. у тебя где-то есть обращение к $category->childs , без скобочек, как если бы это было свойство, а не метод. это коллекция записей - вот это значение и кешируй если надо!
Просто удалил установку bun из dockerfile laravel и все заработало
Т.к. я не очень в курсе потока хайпа в мире JS, пришлось вникать что же такое bun.
While Node.js uses Google's V8 engine that power's Chrome browser, Bun uses JavaScriptCore (JSC), which is an open source JavaScript engine developed by Apple for Safari.
всё понятно - насрать и забыть. сафари это паршивая овца в мире эппл. яблоки тащят и навязывают его несмотря на глюкавость. этакий новый IE6: все страдают, а игнорировать не могут, пока хозяева сами не объявят его мёртвым.
curl -s https://laravel.build/имя проекта | bash
Это всё не совскем про установку Laravel 10, а про установку через Laravel Sail - якобы средство для упрощения установки.
Непонятно зачем авторы Laravel плодят параллельные проекты с какими-то вспомогательными обертками. Как по мне они не упрощают, а только усложняют дело. Они исходят из того, что начинающий разработчик не знает ни git, ни docker, ни основных утилит unix-подобных систем. Но случись малейшая неприятность, оказывается что придется сначала вникнуть в магию этих доп оболочек, а потом таки в git, docker и всё остальное )))
уже есть Homestead - оболочка над vagrant - оболочкой над virualbox для установки в виртуальной машине
утилита laravel - оболочка над git + еще что-то-там-всё-в-одном для того чтобы не знать как это делают в git
valet - всё-в-одном для установки laravel + стек LEMP в среде MacOS
теперь ещё Sail - оболочка чтобы не знать docker, но попробовать запустить laravel в нём
Делай так, чтобы работало. Ничего плохого в switch нет.
Насколько я понял, ты пытаешься хранить в базе шаблоны. Не то чтобы это было невозможно, но imho это ненужная сложность и есть свои минусы.
https://themeforest.net/item/letz-larav … t/26531442
логинишся с данными, подставляемыми автоматом. в демке видишь список компонент. вероятно открыв компоненту сумеешь через инспектор добраться до используемых стилей и скриптов )
По какому руководству делаешь? Все детали как и что прописывать обычно указываются в руководстве.
Если сказано "you may load your application's encryption keys by defining them as environment variables" это значит что этот параметр прописывается в .env.
Passport::routes() это просто подключение пачки готовых маршрутов из пакета. Там внутри прописан каждый маршрут в отдельности. К ключам это отношения не имеет! Не путай горячее с зелёным.
@Biko ты пишешь "свой шаблон", "свой шаблон". Как-будто мы разграничиваем права на шаблоны. (На самом деле мы раздаем права на маршруты или экшены, т.е. на метод контроллера, а не на шаблон)
Годный пример контроля доступа (авторизации) в зависимости от роли есть в документации: https://laravel.com/docs/10.x/middlewar … parameters
Тебе нужно ограничить доступ к маршрутам
- добавить метод hasRole() у User, где ты будешь сравнивать параметр со значением поля role
- написать мидлварь по образцу из доки
- привязать мидлварь с параметром — именем роли к каждому маршруту или сразу к группе маршрутов.
Другая задача: "если он ... чтобы ему открывался ...". Это ты можешь реализовать в методе аутентификации. В доке это метод LoginController:authenticate(). Тебе надо изменить его, прописав в redirect() разные значения в зависимости от роли.
Table 'category_bookins' doesn't exist
Eloquent может добавить 's' когда сам додумывает имя таблицы из имени класса-модели. Но чтобы убрать 'g' это фантастика. Где-то ты сам прописал именно так, просто поищи это слово глобально по коду.
Переход по ссылке - это запрос методом GET. У тебя не описан маршрут для GET, именно об этом тебе говорит сообщение об ошибке. Почему ты решила, что должно быть иначе?
Вообще, считается нормой не изменять данные в методе GET. Поэтому выглядит абсолютно логично, что твой маршрут описан так. Ошибка только в использовании ссылки — тут надо слать форму, а не делать переход. А так как браузер умеет только формы GET или POST, то в этой форме должно быть скрытое поле _method
как рекомендуют в документации
@method('PATCH')
или
{{ method_field('PATCH') }}
что в итоге будет преобразовано в
<input type="hidden" name="_method" value="PATCH">
include/require это не ларавелевский подход. Метод group принимает строку - путь до файла, т.е. у тебя function(){require можно и нужно убрать.
https://darkghosthunter.medium.com/lara … 3f8ba09f49
https://8bityard.com/how-to-create-mult … laravel-8/
...->paginate($perPage)
когда этот необязательный параметр пропущен, то внутри метода paginate() вычисяется как
$perPage = $perPage ?: $this->model->getPerPage();
...
public function getPerPage()
{
return $this->perPage;
}
то есть можнро задать значение по умолчанию для конкретной модели.
P.S. Используй хорошую IDE и смотри её подсказки, прыгай в определение методов!
@if(Cache::has('user-online' . $user->id))
можно заменить на
@if( $user->last_seen->greaterThan(now()->subMinutes(ONLINE_TIMEOUT)) )
будет также работать ->gt(x) : https://carbon.nesbot.com/docs/#api-comparison
да и просто сравнение ">", но это вроде бы недокументированная фича PHP
Здесь я подразумеваю что last_seen у тебя автоматически тайпкастится в Carbon. Потому что так принято в Laravel
— This is the way. May the force be with you.
"Last seen" читается как "Последний раз видели". Сохраняй просто now(). Время последнего визита пользователя не зависит от величины таймаута для вычисления кто онлайн. Логика!!!
А в контроллере вычисляй время назад, то есть отнимай от текущего. Типа
User::where('last_seen', '>', now()->subMinutes(ONLINE_TIMEOUT))->count()
Еще раз: кеш здесь не нужен. Кеш кроме того что необязателен, еще не имеет смысла там, где постоянно происходит обновление. Он оптимизирует ситуацию когда редко пишется и часто читается. И при отсутствии нужных данных в кеше приложение должно выдавать те же результаты! (только может быть немного медленнее) Если у тебя не так, то это логическая ошибка.
Кеш по определению нечто необязательное, может отсутствовать в любой момент. Поэтому применять его таким образом нелогично.
Статус онлайн пользователя определяют через сохранение отметки о его последнем визите. Например в самой таблице пользователей или в специальной таблице. И считаем что пользователь онлайн если он был здесь не более 10 минут назад, к примеру.
Код, который ты цитируешь, "в котором берётся api_token" на самом деле служит для аутентификации по токену. То есть когда правильный токен присутствует в запросе, то в программе будет доступен "текущий пользователь". Вот что там происходит!
Надо полагать, теперь тебе в контроллере надо читать этого юзера, возможно проверять его права доступа и принимать решение давать или не давать. Сам токен тебе уже больше нигде не нужен.
Как мне им воспользоваться в контролёре app/Http/Controllers/AuthorController.php ?
как в документации написано:
$user = Auth::user();
или
$user = $request->user();
Мне нужно посмотреть пришёл ли вместе с post или get запросом APP_KEY и в зависимости от этого продолжить выполнение метода или вернут 403 ошибку если APP_KEY не пришёл.
API_KEY не так работает. Ты путаешь ключ и токен. Ключ используется скриптами для шифрования или подписывания какой-то информации. Используется для создания токенов доступа. Буквально сам ключ не передается никуда!
Советую делать по инструкции из официальной документации. Разделы Authentication, Authorization
Нет, про копирование id в path речи не было. Но ты можешь попробовать это.
Уже пора пробовать, @kull88, давай дальше сам.
Например если хранить путь как это принято в Materialized Paths, это будет очень похоже на оглавление в книге.
Я здесь оставил поле parent_id только чтобы тебе было понятнее как они между собой связаны. Для технологии это MP не нужно.
id parent_id path
-- --------- ----
1 null '1.'
2 1 '1.1.'
3 1 '1.2.'
4 2 '1.1.1.'
5 4 '1.1.1.1.'
. . .
Запрос посчитает количество дочерних узлов для id=2 (+1 т.к. сам узел тоже посчитан)
SELECT COUNT(*)
FROM users
WHERE path LIKE '1.1.%'
Это называется дерево ))) А отношения между пользователями такие обычно при участии в реферальной программе. Но ничего этого не прозвучало )))
Есть несколько эффективных методов хранения древовидных структур - Nested Sets, Materialized (или Storing) Paths, Closure Tables... они позволяют в один запрос к базе получить количество дочерних узлов или добыть сами узлы.
А для id - parent_id (т.н. Adjacency List), такое невозможно. Теперь ты знаешь какие слова гуглить.
Не за что!
DirectoryIndex public/index.php
и
RewriteRule ^(.*)$ public/index.php [L]
как бы намекают что у тебя сайт (был) настроен не на месте. или на месте но не настроен ))) потому что корень сайта уже должен быть в папке public и значит слова public уже не должно появляться в .htaccess
если ты что-то решил у себя, то поделись с другими. не веди себя как будто тебе здесь должны, а ты ничего не должен. мы все в одном положении!
Друг, чтобы программировать надо научиться вопросы задавать внятно. Я несколько раз перечитывал и не понял в чем затруднение. Вот это просто шедевр:
где id=3 потом взять id где равен 3 и пройти дальше.
куда тебе надо пойти?
Общее количество записей добывается если убрать условие where(), оставить только count()
Через отношения или чтобы имена не светились? Это разные задачи.
Если буквально хочешь использовать отношения, то смотри в доках методы with, withCount. Это не равноценно join, т.е. будет другой запрос, но цель возможно будет достигнута.
Если надо взять имя таблицы из определения класса-модели, то сам Тейлор совтует делать так: with(new Model)->getTable();