Laravel по-русски

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

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

#1 Re: Laravel 6/7/8/9/10 » Хранение и доступ к настройкам » 09.02.2024 15:43:34

Нашел решение, которое меня устраивает. Если кому-то покажется полезным ...

Создаю модель 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,  // <---------- тут
    ];

Ну вот и все.

#2 Laravel 6/7/8/9/10 » Хранение и доступ к настройкам » 09.02.2024 12:32:54

Majestio
Ответов: 1

Всем привет. Сделал я две сущности SettingsServiceProvider и SettingsModel. Но возникла проблема - в момент отработки провайдера соединение с БД еще не установлено и возникает ошибка при работе с моделью. Собственно вопрос: как более грамотно вытягивать настройки из БД, желательно единожды на запрос, и желательно без какого-либо кэширования?

#3 Re: Laravel 6/7/8/9/10 » Отношения моделей вместо построителя запросов » 29.01.2023 15:32:35

Если надо взять имя таблицы из определения класса-модели, то сам Тейлор совтует делать так: with(new Model)->getTable();

Норм!

#4 Re: Laravel 6/7/8/9/10 » Отношения моделей вместо построителя запросов » 29.01.2023 15:23:29

Через отношения или чтобы имена не светились? Это разные задачи.

Ну да. Но, как я понял, "из коробки" это невозможно. Видимо не я один задавался этим вопросом. Вот нашел внешний проект, который похоже делает это. Увы, немного поздновато мне, но на будущее - запомнил.

#5 Laravel 6/7/8/9/10 » Отношения моделей вместо построителя запросов » 16.01.2023 13:26:36

Majestio
Ответов: 3

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

Пытаюсь вот осваивать 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();

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

#6 Re: Laravel 6/7/8/9/10 » Вызов метода контроллера непосредственно в шаблоне Laravel » 19.12.2022 10:55:24

Из главного представления в инклуды передавал бы нужные им параметры.

Вот этого я и хотел бы избежать. Хочется "автономности" определенных инклудов. Типа включил и не паришься потом - инклуд сам извлечет нужные данные и их отрисует.

artoodetoo, на первый взгляд компоненты - это то, что мне нужно. Еще поразбираюсь. Спасибо за варианты!

#7 Laravel 6/7/8/9/10 » Вызов метода контроллера непосредственно в шаблоне Laravel » 18.12.2022 21:35:27

Majestio
Ответов: 3

Всем привет!

Подскажите, пожалуйста, вызов методов контроллеров непосредственно в шаблоне - это по фен-шую или нет?

Объясню откуда вопрос. В шаблоне страницы у меня много инклудов, в которых были хардкодом зашиты определенные данные (список стран, категорий и пр.). Сейчас все это берется из БД. Соответственно, в каждом таком инклуде я вызываю метод контроллера для получения нужных данных.

Или все же правильнее написать еще один контроллер/метод, специально для страницы, который предварительно соберет ВСЕ данные нужных типов - а уже во вьюхе они уже будут отрисовываться без этих вот вызовов? Или еще как-то правильнее?

PS. Laravel 8

#9 Laravel 6/7/8/9/10 » Передать количество повторений в наследуемый шаблон Blade » 21.08.2021 17:02:05

Majestio
Ответов: 2

У меня есть вот такая реализация наследуемых шаблонов (упрощенная разметка):

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?

#11 Laravel 6/7/8/9/10 » Перенос сайта на хостинг » 14.04.2021 23:24:39

Majestio
Ответов: 1

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

Возник вопрос (новичка, естественно): "Как правильно переносить разработанный на Laravel 8 сайт с компьютера на хостинг?"

Чтение официальной документации что-то совсем не помогло sad Нет, я в конце концов перенес. Но это было что-то с чем-то, и количество правок зашкаливало. Выполнил правку .env под провайдера, потом:

php artisan optimize
php artisan cache:clear
php artisan route:cache
php artisan view:clear
php artisan config:cache
npm run prod

А потом поиском и заменой во всех найденных файлах проекта правил локальные пути, где был расположен проект, на пути, где он должен лежать у провайдера. Потом сжимал в архив и заливал на хостинг.

А хотелось бы просто выполнить команду, пусть с аргументами, и просто получить готовый архив.

Хелп! Как это делать правильно?

#12 Веб-разработка » Совместное использование Laravel и Svetle возможно? » 06.03.2020 10:54:23

Majestio
Ответов: 0

Небольшое предисловие

Веб-разработкой профессионально не занимаюсь, скорее для саморазвития. В качестве старта изучил связку MODX Revo + Bootstrap 4. И до некоторого времени хватало. Разработка тупых информативных сайтов ограниченной функциональности с помощью этого - просто на ура. Быстро и относительно несложно. И вот захотелось чего-то большего. Чтобы сайты не получались такими жирными, такими тормозными, с таким ограниченным UI. Начал разбираться ...

В качестве бэкэнда выбрал Laravel, читаю, экспериментирую. А вот с фронтэндом сложнее. По сути я им никогда и не занимался. Да, JavaScript бегло читаю, в определенной части все понимаю. Вот также решил выбрать какой-то движок. Сперва выбор пал на Angular. Но дальнейшие "изыскания" заставили пропустить и JQuery как таковой, и Angular, и React, и Vue... и привели к Svetle.

Вопрос

Одна "загвоздка". Все прелесть Svetle - в предварительной компиляции. Вот собственно и возник вопрос - эти технологии можно ли как-то использовать совместно? И если "да", то какой порядок разработки вам видится?

#13 Re: Веб-разработка » Laravel && Git » 17.05.2018 14:27:55

artoodetoo, огромное спасибо! Все понял, все осознал!!!
И кнопочки нашел)))

#14 Re: Веб-разработка » Laravel && Git » 17.05.2018 13:28:38

artoodetoo, спасибо за инфу. Однако автор пакета локализации, если я не ошибаюсь, сам настаивает, чтобы поддерживаемые языки включались в "его" конфиге. Поразбираюсь еще.

#15 Re: Веб-разработка » Laravel && Git » 17.05.2018 11:16:02

Отвечаю сам себе, может кому-нибудь еще пригодится ...

Клонирование проекта нужно выполнить в несколько этапов:


  1. git clone <проект>

  2. composer update

  3. Создание под свое окружение файла .env

Остается "повисшим" вопрос, если что-то правилось в пропускаемых каталогах/файлах, например в:

vendor\mcamara\laravel-localization\src\config\config.php

Это нужно править дополнительно как-то. Возможно этот конфиг можно как-то вынести из пропускаемого. Если найду способ, ответ обновлю.

#16 Веб-разработка » Laravel && Git » 17.05.2018 09:11:17

Majestio
Ответов: 5

Приветствую!

Возник вопрос "как правильно клонировать Laravel-проект?".

Дело в том, что с Laravel, равно как и с Git, пока только разбираюсь. Нашел в интернете материалы как залить проект на гитхаб, сделал для себя шпаргалку по установке и инициализации. Но, когда выгрузил на гитхаб, заметил, что некоторые каталоги типа "test", "vendor", и другие на гитхаб не выгружаются. Посмотрел файл ".gitignore" - там их много.

Таким образом, если я выполню "git clone" в пустом каталоге - я получу проект неполный. Как правильно клонировать Laravel-проект в пустой каталог?
Единственное, что приходит на ум - очистить .gitignore при создании и заливке проекта на гитхаб. Но правильно ли так?

#17 Веб-разработка » Нарисовать секцию на bootstrap 4 » 24.04.2018 23:17:03

Majestio
Ответов: 0

Приветствую!

Нужно разместить блоки в секции вот в таком виде:

48617246edc7ec02ee3bd0fac0149bc2.png

А требования таковы:

  1. Ширина A+Б=100% окна

  2. Ширина Б - по своему содержимому

  3. Высота всей секции - по содержимому Б

  4. Высота В - по своему содержимому

  5. Выравнивание А - по середине ширины и высоты

  6. Выравнивание Б - по середине ширины и высоты

  7. Выравнивание В - по середине высоты, по правой стороне ширины

Пока не получается выполнить п.4-7.
Хелп!!!

#18 Re: Laravel 5.x » Бронирование номеров - алгоритм » 14.04.2018 18:21:03

Внешняя контора лепила сайт. На ModX Evolution. Ну ланна, свой фреймворк. Хрен с ним! На акции с фоном леса на бекграунде фона леса, это просто песец какойта!

#19 Re: Laravel 5.x » Бронирование номеров - алгоритм » 14.04.2018 18:15:30

TrueKanonir, в кодировании - нет. А вот в определении бизнес-логики туман. По крайней мере у себя я от боссов не могу добиться адеквата. Пока есть https://greenparkhotel.by. Дизайн не мой, равно как и функционал. Работаю и терплю. Хотя ... кровь из глаз от увиденного.

#20 Re: Laravel 5.x » Бронирование номеров - алгоритм » 14.04.2018 16:50:47

Опыта нет - но будет! :-)

Алгоритм бронирования сам по себе несложен - посетитель вводит диапазон дат и тип номера. Программа по "шахматке" дат находит (или не находит) необходимые номера. Тут все просто как грабли.

Вопросы есть болеее, чем менее ...

1) Заселение семьи с ребенком
- нужна отдельная кровать/не нужна
- нужна отдельная комната/не нужна

2) Заселение группы (допустим экипажа самолета)
- группа однополая, распределение по кроватям в номере
- группа разнополая, распределение и по кроватям в номере, и по полу
- иной вариант (допустим в экипаже одна пара женато-замужних)

У меня тож есть такой вопрос, но однозначного ответа пока, увы - нет!
В плане прогания - решается все. Вот бы с бизнес-логикой определиться.

#22 Re: Laravel 5.x » Мультиязычность в Laravel 5 » 14.04.2018 14:55:06

Всем большое спасибо!
Остался вопрос инициализации текущего языка, если у клиента сохранились куки.

novichok, в простейшем случае - прокатит. Но я планирую создать схему с конструируемыми "материалами". Ожидается, будет на порядок сложнее.

#23 Laravel 5.x » Мультиязычность в Laravel 5 » 14.04.2018 11:57:41

Majestio
Ответов: 6

Приветствую!

Пользую Laravel 5.6, php 7.2, mysql 5.(6?), разработка под виндой 10. Потом планирую все это перенести под FreeBSD. В общем, это все не важно.

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

1) Автор статьи решил использовать middleware-решение. В комментах ему посоветовали другой вариант - просто использовать локаль в маршрутах. А автор статьи, и комментирующий обозвали друг друга огородостроителями :-) Кто из них прав? Если оба неправы - то как правильно?

2) Автор статьи в своем решении в некоторых местах парсит URL, потом его склеивает. А нельзя ли это решение упростить? А именно, прописывать в маршрутах URL без указания языка, до обработки брать текущую локаль из куков, и вставлять язык из куков или по умолчанию и отправлять на последующую обработку? Мне кажется, если получится избавиться от парсинга/склейки URL, то будет кода по-меньше. Ваше мнение?

И вопрос не по статье

Как посоветуете организовать хранение в БД мультиязычных материалов? Например различных новостей, событий, галлерей ... & etc.

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