firep91613
Новичок
А что именно нужно показать? Это скрин из браузера, исходный код страницы и открытый JS файл.Не видя, что именно отдаётся, никто тебе не скажет.
Их только два )Предложи лучший способ.

А что именно нужно показать? Это скрин из браузера, исходный код страницы и открытый JS файл.Не видя, что именно отдаётся, никто тебе не скажет.
Их только два )Предложи лучший способ.
Нужно ссылку на сайт, где это происходит. И код ДО того, как ты начал данные в мусор превращать.А что именно нужно показать?
Щас вообще не понял. Что значит "превращать данные в мусор"? Я просто написал скрипт, создал JS файл, вставил код, подключил ко вьюшке. Все. В инструментах разработчика, кстати, правильно отображает. Да, забыл, в CSS написал комментарии - там так же каракули...как ты начал данные в мусор превращать
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Config\Repository as Config;
class Setting extends Model
{   /*
    public function __construct(protected Config $config)
    {
        parent::__construct();
    }
    */
    protected $fillable = ['value'];
    public function isImage($value): bool {
        //$imageExtensions = $this->config->get('custom.allowed_image_extensions');
        $imageExtensions = \Illuminate\Support\Facades\Config::get('custom.allowed_image_extensions');
        $extension = strtolower(pathinfo($value, PATHINFO_EXTENSION));
        return in_array($extension, $imageExtensions);
    }
}<td class="table__cell">
    @if($setting->isImage($setting->value, config('custom.allowed_image_extensions')))
        <img src="{{ config('custom.symbolic_images_link') . $setting->value }}" alt="">
    @else
        {{ $setting->value }}
    @endif
</td>public function edit(Post $post, CategoryQueries $categoryQueries, TagQueries $tagQueries, ViewFactory $view): View
{
    return $view->make(self::ACTION_EDIT, [
        'post' => $post,
        'categories' => $categoryQueries->getAll(),
        'tags' => $tagQueries->getAll()
    ]);
}class BlogComposer {
   public funtcion __construcor(public Post $post, public CategoryQueries $categoryQueries, public TagQueries $tagQuerie) {}
}<?php declare(strict_types=1);
namespace App\Http\Controllers\Admin;
use App\Composers\StatComposer;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\View\View;
use Illuminate\View\Factory as ViewFactory;
final class DashboardController extends Controller
{
    const ACTION_INDEX = 'admin.dashboard';
    const LAST_USERS_COUNT = 5;
    const LAST_COMMENTS_COUNT = 5;
    public function __invoke(StatComposer $statComposer, ViewFactory $view): View
    {
        return $view->make(self::ACTION_INDEX, [
            'usersCount' => $statComposer->userQueries->count(),
            'postsCount' => $statComposer->postQueries->count(),
            'latestUsers' => $statComposer->userQueries->getLastUsers(self::LAST_USERS_COUNT),
            'latestComments' => $statComposer->commentQueries->getLastComments(self::LAST_COMMENTS_COUNT)
        ]);
    }
}public function edit(Post $post, CategoryQueries $categoryQueries, TagQueries $tagQueries, ViewFactory $view): View - вот тут видимо можно объеденить только $categoryQueries и $tagQueries? Потому что в маршруте же привязка есть - '/{post:slug}/edit'.public function update(UpdatePostRequest $request, Post $post, PostQueries $postQueries, Redirector $redirect): RedirectResponse - а тут даже и не знаю что можно объеденить.Я все понял! Надо в классах, которые Queries оставить только выборки, а всю логику с обновлением и удалением перенести в модели. Тогда будет только три.public function update(UpdatePostRequest $request, Post $post, PostQueries $postQueries, Redirector $redirect): RedirectResponse- а тут даже и не знаю что можно объеденить.
 Куда тогда этот метод деть?
 Куда тогда этот метод деть?public function update(Post $post, array $data): void
{
    try {
        if (isset($data['image'])) {
            $data['image'] = $this->uploader->uploadPostImage($data['image']);
        }
        $oldImage = $post->image;
        $tag_id = $data['tag_id'];
        unset($data['tag_id']);
        $this->db->beginTransaction();
        $post->update($data);
        $post->tags()->sync($tag_id);
        $this->db->commit();
        if ($oldImage && isset($data['image'])) {
            $this->storage->delete($oldImage);
        }
    } catch (\Throwable $e) {
        if (isset($data['image'])) {
            $this->storage->delete($data['image']);
        }
        $this->db->rollBack();
        throw new DbException("Ошибка обновления поста: {$e->getMessage()}");
    }
}Хранить то можно, но что является реальным ключом? Попробуй отредактировать этот "слаг" в URLЯ думаю у каждой колонки должно быть свое предназначение. Можно и слаг и айди хранить. Тут, например и айди и слаг - Создание-блога.88142/page-14
Этот вопрос понятен только тебе. Какая связь этого кода с конструктором который якобы не работает, зачем его куда-то переносить, почему именно в модель?Не получится. В моделях не работают кострукторыКуда тогда этот метод деть?
У тебя код на PHP в какой кодировке? ))) А страница в какой кодировке?Почему у меня в JS файлах вместо русских символов отображаются каракули? Это что, nginx не правильно кодировку отдает? Laravel же вроде никаких лишних заголовков не добавляет.
Посмотреть вложение 1653

Я хотел сократить количество зависимостей у метода update. Потому что почти в каждом контроллере у этого метода по четыре зависимости. Для того чтобы сделать обновление нужно передавать экземпляр модели и этот класс, PostQueries в данном случае (Post $post, PostQueries $postQueries). А если сделать у модели метод, скажем, postUpdate, то его можно было бы вызывать на самом экземпляре модели и тогда бы PostQueries был бы не нужен.Этот вопрос понятен только тебе. Какая связь этого кода с конструктором который якобы не работает, зачем его куда-то переносить, почему именно в модель?
У меня так и сделано.ИМХО, в классе модели должны быть описаны только отношения и возможно какой-то необходимый кастинг типов. Для "логики" нужен дополнительный слой.
UTF-8 все. Я даже VSCode сменил на PhpStorm. Там внизу видно - UTF-8. Но ничего не поменялось.У тебя код на PHP в какой кодировке? ))) А страница в какой кодировке?
Я как-то не подумал об этом.Кстати, привычка всё скриншотить вместо копирования текста где это возможно, это плохая привычка. Вот как этот текст скормить в "автоматически распознаватель кодировки online" ?
А страница в какой кодировке?
<meta charset="UTF-8"> - это же имелось ввиду?Хз что такое PostQueries.А если сделать у модели метод, скажем, postUpdate, то его можно было бы вызывать на самом экземпляре модели и тогда бы PostQueries был бы не нужен.
Не, сам контент, статьи, отображаются правильно. Я же писал, что это в файлах JS и CSS в исходном коде, когда открываешь. Вот приехала страница в браузер. Там такой код:Данные из базы берутся? Если да, то надо проверить кодировку соединения с базой. Это не то, что светится в уголке PhpStorm, а то что прописано в параметрах соединения с базой. В Laravel это config/database.php По умолчанию клиент mysql соединяется как cp1252 !
В принципе, данные могут храниться в поле например с кодировкой cp1251, а читаться клиентом (т.е. php-скриптом) с кодировкой соединения utf8mb4. Или наоброт. Сервер БД умеет перекодировать туда-сюда. Shit happens когда данные перекодируются не в ту кодировку, которую ты объявляешь для отображения вебстраницы/данных json. Или данные уже были испорчены при записи по той же причине - кодировка соединения была указана не та.
Это, как мне кажется, и есть твой случай.
    <script src="http://localhost:8080/js/slug.js"></script>
    <script>
        (new SlugGenerator(
            document.getElementById('title'),
            document.getElementById('slug')
        )).init();
    </script>class SlugGenerator {
    #translitMap = {
        'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'yo', 'ж': 'zh',
        'з': 'z', 'и': 'i', 'й': 'y', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
        'п': 'p', 'Ñ€': 'r', 'Ñ': 's', 'Ñ‚': 't', 'у': 'u', 'Ñ„': 'f', 'Ñ…': 'h', 'ц': 'ts',
        'ч': 'ch', 'ш': 'sh', 'щ': 'sch', 'ÑŠ': '', 'Ñ‹': 'y', 'ÑŒ': '', 'Ñ': 'e', 'ÑŽ': 'yu', 'Ñ': 'ya'
    };
    #isPasting = false;
    #title;
    #slug;
    constructor(title, slug) {
        this.#title = title;
        this.#slug = slug;
    }
    init() {
        this.#title.addEventListener('input', this.#inputHandler.bind(this));
        this.#title.addEventListener('paste', this.#pasteHandler.bind(this));
    }
    #inputHandler(e) {
        if (this.#isPasting) return;
        const target = e.target;
        const targetValue = target.value;
        slug.value = this.#getUpdatedSlug(targetValue);
    }
    #pasteHandler(e) {
        this.#isPasting = true;
        const target = e.target;
        const data = e.clipboardData.getData('text/plain').trim();
        this.#setNewTitleValue(target, data);
        slug.value = this.#getUpdatedSlug(target.value);
        e.preventDefault();
        setTimeout(() => this.#isPasting = false, 0);
    }
    #getUpdatedSlug(targetValue) {
        let slug = '';
        for (let i = 0; i < targetValue.length; i++) {
            const ch = targetValue[i].toLowerCase();
            if (ch === ' ') {
                slug += '-';
            } else if (/[a-zа-ÑÑ‘0-9]/.test(ch)) {
                slug += this.#translitMap[ch] ?? ch.toLowerCase();
            }
        }
        return slug;
    }
    #setNewTitleValue(elem, data) {
        const start = elem.selectionStart;
        const end = elem.selectionEnd;
        elem.value = elem.value.substring(0, start) + data + elem.value.substring(end);
        elem.selectionStart = elem.selectionEnd = start + data.length;
    }
}А это как раз дополнительный слой для логики. Чтобы не раздувать модели. Вот:Хз что такое PostQueries.
<?php declare(strict_types=1);
namespace App\Queries\Admin;
use App\Models\Post;
use App\Exceptions\DbException;
use App\Services\ImageUploader;
use Illuminate\Contracts\Filesystem\Filesystem;
use Illuminate\Database\Connection;
use Illuminate\Pagination\LengthAwarePaginator;
final class PostQueries
{
    const PER_PAGE = 5;
    public function __construct(
        protected Post $model,
        protected Connection $db,
        protected Filesystem $storage,
        protected ImageUploader $uploader
    ) {}
    public function save(array $data): void
    {
        try {
            if (isset($data['image'])) {
                $data['image'] = $this->uploader->uploadPostImage($data['image']);
            }
            $tag_id = $data['tag_id'];
            unset($data['tag_id']);
            $this->db->beginTransaction();
            $post = $this->model->create($data);
            $post->tags()->attach($tag_id);
            $this->db->commit();
        } catch (\Throwable $e) {
            if (isset($data['image'])) {
                $this->storage->delete($data['image']);
            }
            $this->db->rollBack();
            throw new DbException("Ошибка создания поста: {$e->getMessage()}");
        }
    }
    public function update(Post $post, array $data): void
    {
        try {
            if (isset($data['image'])) {
                $data['image'] = $this->uploader->uploadPostImage($data['image']);
            }
            $oldImage = $post->image;
            $tag_id = $data['tag_id'];
            unset($data['tag_id']);
            $this->db->beginTransaction();
            $post->update($data);
            $post->tags()->sync($tag_id);
            $this->db->commit();
            if ($oldImage && isset($data['image'])) {
                $this->storage->delete($oldImage);
            }
        } catch (\Throwable $e) {
            if (isset($data['image'])) {
                $this->storage->delete($data['image']);
            }
            $this->db->rollBack();
            throw new DbException("Ошибка обновления поста: {$e->getMessage()}");
        }
    }
    public function delete(Post $post): void
    {
        try {
            $image = $post->image;
            $this->db->beginTransaction();
            $post->tags()->detach();
            $post->category()->dissociate();
            $post->delete();
            $this->db->commit();
            if ($image) {
                $this->storage->delete($image);
            }
        } catch (\Throwable $e) {
            $this->db->rollBack();
            throw new DbException("Ошибка удаления поста: {$e->getMessage()}");
        }
    }
    public function latestPaginated(): LengthAwarePaginator
    {
        return $this->model->orderBy('id', 'desc')->paginate(self::PER_PAGE);
    }
    public function count(): int
    {
        return $this->model->count();
    }
}Дак он уже написан. В принципе, им уже можно пользоваться и заливать на хостинг. Хотя может я и ошибаюсь. Регистрация есть, авторизация, пользователям можно менять группы, пользователи могут писать комментарии к статьям, искать информацию, редактировать свои профили. Админка тоже есть, там можно всем управлять. Ну тесты еще не все написал.Тебе надо написать блог
А на каком уровне стоит? Мне все таки хочется сделать код максимально чистым.По моему на том уровне, на котором ты находишься вообще незачем играть в улучшайзинг.
