Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Нашел решение, которое меня устраивает. Если кому-то покажется полезным ...
Создаю модель SettingsModel, миграцию под нее, сидер. Потом создаю middleware под названием LoadSettingsFromDatabase и регаю его глобально в app/Http/Kernel.php. Код app/Http/Middleware/LoadSettingsFromDatabase.php следующий:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use App\Models\SettingsModel;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
class LoadSettingsFromDatabase
{
/**
* Handle an incoming request.
*
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
*/
public function handle(Request $request, Closure $next): Response
{
if (!Cache::has('settings')) {
$settings = SettingsModel::all();
foreach ($settings as $setting) {
config(['settings.'.$setting->key => $setting->value]);
}
Cache::put('settings', $settings, 5);
Log::alert('read settings from database');
} else {
$settings = Cache::get('settings');
foreach ($settings as $setting) {
config(['settings.'.$setting->key => $setting->value]);
}
Log::alert('settings loaded from cache');
}
return $next($request);
}
}
Для теста в шаблоне главной страницы пишу:
{{ config('settings.theme') }}
Собственно, что выводит мне bootstrap5-theme. В логах storage/logs/laravel.log наблюдаю с одного запроса:
[2024-02-09 12:03:48] local.ALERT: read settings from database
[2024-02-09 12:03:48] local.ALERT: settings loaded from cache
[2024-02-09 12:03:48] local.ALERT: settings loaded from cache
app/Models/SettingsModel.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SettingsModel extends Model
{
use HasFactory;
protected $table = 'settings';
protected $fillable = ['key', 'value'];
}
database/migrations/2024_02_09_112339_create_settings_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('settings', function (Blueprint $table) {
$table->id();
$table->string('key');
$table->string('value');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('settings');
}
};
database/seeders/SettingsSeeder.php
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use App\Models\SettingsModel;
class SettingsSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
SettingsModel::create([
'key' => 'theme',
'value' => 'bootstrap5-theme'
]);
}
}
Ну а глобальную регу мидлваря производим в app/Http/Kernel.php, тут:
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\LoadSettingsFromDatabase::class, // <---------- тут
];
Ну вот и все.
Всем привет. Сделал я две сущности SettingsServiceProvider и SettingsModel. Но возникла проблема - в момент отработки провайдера соединение с БД еще не установлено и возникает ошибка при работе с моделью. Собственно вопрос: как более грамотно вытягивать настройки из БД, желательно единожды на запрос, и желательно без какого-либо кэширования?
Если надо взять имя таблицы из определения класса-модели, то сам Тейлор совтует делать так: with(new Model)->getTable();
Норм!
Через отношения или чтобы имена не светились? Это разные задачи.
Ну да. Но, как я понял, "из коробки" это невозможно. Видимо не я один задавался этим вопросом. Вот нашел внешний проект, который похоже делает это. Увы, немного поздновато мне, но на будущее - запомнил.
Здравствуйте!
Пытаюсь вот осваивать Laravel 8. Появился вопрос, может быть поможете ... Я написал работающий код:
$id = Auth::User()->id;
$orderCount = DB::table('orders')
->join('order_products', 'order.id', '=', 'order_products.order_id')
->where('status', '=', 0)
->where('user_id', '=', $id)
->count();
Можно ли как-то вместо построителя запросов относительно таблиц - написать тоже самое, но через отношение моделей? Вообще возможно ли такое? В смысле - чтобы имена таблиц тут не светились в явном виде.
Из главного представления в инклуды передавал бы нужные им параметры.
Вот этого я и хотел бы избежать. Хочется "автономности" определенных инклудов. Типа включил и не паришься потом - инклуд сам извлечет нужные данные и их отрисует.
artoodetoo, на первый взгляд компоненты - это то, что мне нужно. Еще поразбираюсь. Спасибо за варианты!
Всем привет!
Подскажите, пожалуйста, вызов методов контроллеров непосредственно в шаблоне - это по фен-шую или нет?
Объясню откуда вопрос. В шаблоне страницы у меня много инклудов, в которых были хардкодом зашиты определенные данные (список стран, категорий и пр.). Сейчас все это берется из БД. Соответственно, в каждом таком инклуде я вызываю метод контроллера для получения нужных данных.
Или все же правильнее написать еще один контроллер/метод, специально для страницы, который предварительно соберет ВСЕ данные нужных типов - а уже во вьюхе они уже будут отрисовываться без этих вот вызовов? Или еще как-то правильнее?
PS. Laravel 8
Супер! Спасибо. Второй вариант - то, что нужно!
У меня есть вот такая реализация наследуемых шаблонов (упрощенная разметка):
chunks/incl.blade.php
@for ($i = 2; $i <= $count; $i++)
<div id="card-guests-{{ $i }}" class="card-body booking-card-body d-none"></div>
@endfor
layouts/parent.blade.php
<div id="guests-info">
@yield('guest-count')
@include('chunks.incl', ['count' => $guest_count])
</div>
child.blade.php
@extends('layouts.parent')
@section('guest-count')
@php
$guest_count = 20;
@endphp
@endsection
@section('room-guests',20)
Все работает как надо, но мне не нравится реализация!
Видимо что-то я не доучил, что-то не дочитал ...
Вопрос
Как еще можно (более красиво) из шаблона child.blade.php передать количество повторений во включаемый шаблон incl.blade.php?
<div class="d-flex justify-content-center">
{{$category->links()}}
</div>
???
Здравствуйте!
Возник вопрос (новичка, естественно): "Как правильно переносить разработанный на Laravel 8 сайт с компьютера на хостинг?"
Чтение официальной документации что-то совсем не помогло Нет, я в конце концов перенес. Но это было что-то с чем-то, и количество правок зашкаливало. Выполнил правку .env под провайдера, потом:
php artisan optimize
php artisan cache:clear
php artisan route:cache
php artisan view:clear
php artisan config:cache
npm run prod
А потом поиском и заменой во всех найденных файлах проекта правил локальные пути, где был расположен проект, на пути, где он должен лежать у провайдера. Потом сжимал в архив и заливал на хостинг.
А хотелось бы просто выполнить команду, пусть с аргументами, и просто получить готовый архив.
Хелп! Как это делать правильно?
Небольшое предисловие
Веб-разработкой профессионально не занимаюсь, скорее для саморазвития. В качестве старта изучил связку MODX Revo + Bootstrap 4. И до некоторого времени хватало. Разработка тупых информативных сайтов ограниченной функциональности с помощью этого - просто на ура. Быстро и относительно несложно. И вот захотелось чего-то большего. Чтобы сайты не получались такими жирными, такими тормозными, с таким ограниченным UI. Начал разбираться ...
В качестве бэкэнда выбрал Laravel, читаю, экспериментирую. А вот с фронтэндом сложнее. По сути я им никогда и не занимался. Да, JavaScript бегло читаю, в определенной части все понимаю. Вот также решил выбрать какой-то движок. Сперва выбор пал на Angular. Но дальнейшие "изыскания" заставили пропустить и JQuery как таковой, и Angular, и React, и Vue... и привели к Svetle.
Вопрос
Одна "загвоздка". Все прелесть Svetle - в предварительной компиляции. Вот собственно и возник вопрос - эти технологии можно ли как-то использовать совместно? И если "да", то какой порядок разработки вам видится?
artoodetoo, огромное спасибо! Все понял, все осознал!!!
И кнопочки нашел)))
artoodetoo, спасибо за инфу. Однако автор пакета локализации, если я не ошибаюсь, сам настаивает, чтобы поддерживаемые языки включались в "его" конфиге. Поразбираюсь еще.
Отвечаю сам себе, может кому-нибудь еще пригодится ...
Клонирование проекта нужно выполнить в несколько этапов:
git clone <проект>
composer update
Создание под свое окружение файла .env
Остается "повисшим" вопрос, если что-то правилось в пропускаемых каталогах/файлах, например в:
vendor\mcamara\laravel-localization\src\config\config.php
Это нужно править дополнительно как-то. Возможно этот конфиг можно как-то вынести из пропускаемого. Если найду способ, ответ обновлю.
Приветствую!
Возник вопрос "как правильно клонировать Laravel-проект?".
Дело в том, что с Laravel, равно как и с Git, пока только разбираюсь. Нашел в интернете материалы как залить проект на гитхаб, сделал для себя шпаргалку по установке и инициализации. Но, когда выгрузил на гитхаб, заметил, что некоторые каталоги типа "test", "vendor", и другие на гитхаб не выгружаются. Посмотрел файл ".gitignore" - там их много.
Таким образом, если я выполню "git clone" в пустом каталоге - я получу проект неполный. Как правильно клонировать Laravel-проект в пустой каталог?
Единственное, что приходит на ум - очистить .gitignore при создании и заливке проекта на гитхаб. Но правильно ли так?
Приветствую!
Нужно разместить блоки в секции вот в таком виде:
А требования таковы:
Ширина A+Б=100% окна
Ширина Б - по своему содержимому
Высота всей секции - по содержимому Б
Высота В - по своему содержимому
Выравнивание А - по середине ширины и высоты
Выравнивание Б - по середине ширины и высоты
Выравнивание В - по середине высоты, по правой стороне ширины
Пока не получается выполнить п.4-7.
Хелп!!!
Внешняя контора лепила сайт. На ModX Evolution. Ну ланна, свой фреймворк. Хрен с ним! На акции с фоном леса на бекграунде фона леса, это просто песец какойта!
TrueKanonir, в кодировании - нет. А вот в определении бизнес-логики туман. По крайней мере у себя я от боссов не могу добиться адеквата. Пока есть https://greenparkhotel.by. Дизайн не мой, равно как и функционал. Работаю и терплю. Хотя ... кровь из глаз от увиденного.
Опыта нет - но будет! :-)
Алгоритм бронирования сам по себе несложен - посетитель вводит диапазон дат и тип номера. Программа по "шахматке" дат находит (или не находит) необходимые номера. Тут все просто как грабли.
Вопросы есть болеее, чем менее ...
1) Заселение семьи с ребенком
- нужна отдельная кровать/не нужна
- нужна отдельная комната/не нужна
2) Заселение группы (допустим экипажа самолета)
- группа однополая, распределение по кроватям в номере
- группа разнополая, распределение и по кроватям в номере, и по полу
- иной вариант (допустим в экипаже одна пара женато-замужних)
У меня тож есть такой вопрос, но однозначного ответа пока, увы - нет!
В плане прогания - решается все. Вот бы с бизнес-логикой определиться.
novichok, и еще раз - большое спасибо!
Всем большое спасибо!
Остался вопрос инициализации текущего языка, если у клиента сохранились куки.
novichok, в простейшем случае - прокатит. Но я планирую создать схему с конструируемыми "материалами". Ожидается, будет на порядок сложнее.
Приветствую!
Пользую Laravel 5.6, php 7.2, mysql 5.(6?), разработка под виндой 10. Потом планирую все это перенести под FreeBSD. В общем, это все не важно.
Возникла необходимость склепать несколько сайтов небольшого размера. Начал читать доки по Laravel 5. Идеология вроде достаточна понятна. Решил начать с того, что хочу смастерить в самом начале шаблон мультиязычного сайта. Нашел статью по этому вопросу. Прочитал - тоже все понятно. Но возникли вопросы по статье:
1) Автор статьи решил использовать middleware-решение. В комментах ему посоветовали другой вариант - просто использовать локаль в маршрутах. А автор статьи, и комментирующий обозвали друг друга огородостроителями :-) Кто из них прав? Если оба неправы - то как правильно?
2) Автор статьи в своем решении в некоторых местах парсит URL, потом его склеивает. А нельзя ли это решение упростить? А именно, прописывать в маршрутах URL без указания языка, до обработки брать текущую локаль из куков, и вставлять язык из куков или по умолчанию и отправлять на последующую обработку? Мне кажется, если получится избавиться от парсинга/склейки URL, то будет кода по-меньше. Ваше мнение?
И вопрос не по статье
Как посоветуете организовать хранение в БД мультиязычных материалов? Например различных новостей, событий, галлерей ... & etc.
Страницы 1