Просмотрено
Tag: Laravel

Туннель в локальную сеть с SSL без внешнего IP.

Туннель в локальную сеть с SSL без внешнего IP.

Для разработки бота Telegram мне нужно, чтобы мой проект был доступен через интернет.

Конечно, можно открыть порты на роутере, если есть белый IP-адрес. Но если его нет или нет желания возиться с настройками роутера, можно воспользоваться Tuna.

Tuna позволяет без лишних сложностей создать туннель на локальный компьютер, который будет доступен из интернета и иметь SSL-сертификат, что важно при создании бота Telegram.

У Tuna есть различные тарифные планы, но меня вполне устраивает бесплатный вариант.

Тарифы Tuna

Для начала работы необходимо зарегистрироваться в Tuna и получить токен. После регистрации устанавливаем Tuna, используя PowerShell, с помощью следующей команды:

winget install --id yuccastream.tuna

После установки не забудьте перезапустить PowerShell. Без перезапуска PowerShell может не распознать команду «tuna».Чтобы установить токен, введите следующую команду:

tuna config save-token <ТОКЕН>

Теперь можно поднять наш туннель:

tuna http 8000

Подробнее о параметрах можно почитать в официальной документации.

Запущенный туннель

Теперь можно перейти по домену, который нам предоставил Tuna. На этом домене у меня будет доступен Laravel.

Доступный Laravel по выданному нам адресу.

Также можно обратиться по адресу http://127.0.0.1:4040. Там будут доступны все запросы со статусами ответов и настройками.

Web интерфейс Tuna

Вот и всё. Надеюсь, эта статья была для вас полезной.

Не работает метод map() с методом paginate() в Laravel Eloquent.

Не работает метод map() с методом paginate() в Laravel Eloquent.

Не работает метод map() с методом paginate() в Laravel Eloquent.

Столкнулся с проблемой, не работает метод map() с методом paginate() в Laravel Eloquent. Метод map() создает новую коллекцию. Соответственно при попытке использовать его с методом paginate() ничего не получится. Используя map() мы получим коллекцию без пагинации.

$users = User::paginate($request->per_page ?? 10)->map(function ($user) {
            $user->confirm_email = $user->email_verified_at ? true : false;
            $user->role_name = $user->roles()->first() ? $user->roles()->first()->name : null;
            return $user;
        });

Для того, чтобы изменить значения в полученной коллекции, нужно использовать метод through().

 $users = User::paginate($request->per_page ?? 10)->through(function ($user) {
            $user->confirm_email = $user->email_verified_at ? true : false;
            $user->role_name = $user->roles()->first() ? $user->roles()->first()->name : null;
            return $user;
        });

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


Пагинация массива в Laravel

Пагинация массива в Laravel

Пагинация массива в Laravel

Пагинация массива в Laravel достаточно делается легко при помощи класса LengthAwarePaginator.

// Импортируем класс
use Illuminate\Pagination\LengthAwarePaginator as Paginator;

// Получаем текущую страницу
$currentPage = Paginator::resolveCurrentPage();
// Создаем коллекцию
$collection = collect($categories);
// Задаем кол-во элементов на страницу
$perPage = 15;
// Выбираем элементы для текущей страницы
$currentPageItems = $collection->slice(($currentPage - 1) * $perPage, $perPage);

// Создаем экземпляр класса Paginator
$items = new Paginator($currentPageItems, count($collection), $perPage);
// Указываем URI для генерации ссылок пагинации
$items->setPath($request->url());

// Возвращаем представление
return view('pagination', compact('items'));

В представлении для вывода пагинации используем как и в обычной пагинации $items->links().

<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Пагинация массива</title>
</head>
<body>
@foreach($items as $item)
    {{ $item['name'] }} <br>
@endforeach

{{ $items->links() }}

</body>
</html>
Добавляем CKEditor 4 в Laravel Orchid + Laravel Filemanager

Добавляем CKEditor 4 в Laravel Orchid + Laravel Filemanager

CKEditor в Laravel Orchid

В данной статье я расскажу как добавить поле с WYSIWYG редактором CKEditor 4 в Laravel Orchid.
В первую очередь нужно установить сам CKEditor. Для этого в консоли выполняем:

npm install ckeditor4

После создаем файл resources\js\controllers\ckeditor_controller.js со следующим содержимым:

export default class extends window.Controller {
    connect() {
        CKEDITOR.replace('ckeditor', {
            height: '500px'
        });
    }
}

Файл resources\js\dashboard.js с содержимым:

import Ckeditor_controller from './controllers/ckeditor_controller';

application.register("ckeditor", Ckeditor_controller);

В файл webpack.mix.js добавляем:

mix.copyDirectory('./node_modules/ckeditor4/', 'public/js/ckeditor4');
mix.js('resources/js/dashboard.js', 'public/js');

Собираем все:

npm run dev

Регистрируем наши ресурсы в app\Providers\AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Orchid\Platform\Dashboard;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot(Dashboard $dashboard)
    {
        $dashboard->registerResource('scripts', '/js/ckeditor4/ckeditor.js');
        $dashboard->registerResource('scripts', '/js/dashboard.js');
    }
}

Создаем класс нашего кастомного поля app\Orchid\Fields\CKEditor.php

<?php

namespace App\Orchid\Fields;

use Orchid\Screen\Field;

class CKEditor extends Field
{
    /**
     * Blade template
     *
     * @var string
     */
    protected $view = 'fields.ckeditor';

    /**
     * Default attributes value.
     *
     * @var array
     */
    protected $attributes = [];

    /**
     * Attributes available for a particular tag.
     *
     * @var array
     */
    protected $inlineAttributes = [];
}

Создаем файл представления resources\views\fields\ckeditor.blade.php

<div data-controller="ckeditor">
    <div class="form-group">
        <lable class="text-wrap mt-2 form-label">{{ $title }}</lable>
        <textarea name="{{ $name }}" id="ckeditor">{{ $value }}</textarea>
    </div>
</div>

На этом наше поле готово. Переходим в экран и добавляем:

CKEditor::make('news.text')
    ->title('Текст новости')

И получаем результат

Поле CKEditor в Laravel Orchid
Поле CKEditor в Laravel Orchid

Добавление Laravel Filemanager в CKEditor 4

Также можно добавить Laravel Filemanager в наш CKEditor. Для этого устанавливаем его. Подробнее про файловый менеджер можно почитать тут

 composer require unisharp/laravel-filemanager
 php artisan vendor:publish --tag=lfm_config
 php artisan vendor:publish --tag=lfm_public
 php artisan storage:link

Файл resources\js\controllers\ckeditor_controller.js приводим к такому виду:

export default class extends window.Controller {
    connect() {
        CKEDITOR.replace('ckeditor', {
            height: '500px',
            filebrowserImageBrowseUrl: '/laravel-filemanager?type=Images',
            filebrowserImageUploadUrl: '/laravel-filemanager/upload?type=Images&_token=',
            filebrowserBrowseUrl: '/laravel-filemanager?type=Files',
            filebrowserUploadUrl: '/laravel-filemanager/upload?type=Files&_token='
        });
    }
}

Билдим еще раз:

npm run dev

И получаем наш результат:

Laravel Filemanager + CKEditor
Laravel Filemanager + CKEditor
Laravel Filemanager + CKEditor
Laravel Filemanager + CKEditor