wsssoftware/laraveltoolkit

一个包含基本工具的Laravel Toolkit

0.5.0 2024-09-13 19:57 UTC

This package is auto-updated.

Last update: 2024-09-27 23:37:58 UTC


README

Packagist Version NPM Version GitHub Tests Action Status GitHub Code Style Action Status codecov Packagist Downloads NPM Downloads

Laravel项目集成的Vue、Inertia、Primevue和其他的有用工具。

安装Laravel

您可以通过composer安装此包

composer require wsssoftware/laraveltoolkit

您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="laraveltoolkit-config"

您可以使用以下命令发布站点地图配置文件

php artisan vendor:publish --tag="laraveltoolkit-sitemap"

安装JS

npm i -D laraveltoolkit

要使Laravel Toolkit能够编译其tailwind,必须在tailwind配置文件中添加此行

    content: [
        // ...
        './node_modules/laraveltoolkit/resources/**/*.{js,vue,ts}',
        // ...
    ]

使用

闪存

闪存帮助您向UI发送消息。

use LaravelToolkit\Facades\Flash;
use LaravelToolkit\Flash\Severity;

// You can use this severities
Flash::success('Success Test');
Flash::info('Info Test');
Flash::warn('Warn Test');
Flash::error('Error Test');
Flash::secondary('Secondary Test');
Flash::contrast('Contrast Test');

// You can pass a summary
Flash::success('Message detail', 'Success!');

// You can mark flash as closable or unclosable
Flash::success('Success Test closable')->closable();
Flash::success('Success Test unclosable')->unclosable();

// You can pass a lifetime in seconds to your flash
Flash::success('Success Test with life')->withLife(2000);

// Your message can belong to another group (renders in another primevue group)
Flash::success('Success Test in other group')->withGroup('foo_bar');

// You can test flash using
 Flash::assertFlashed(Severity::SUCCESS, 'User saved!');
 Flash::assertNotFlashed(Severity::SUCCESS, 'User saved!');

您必须首先根据此指南配置primevue Toast服务,然后将在Vue布局或需要的位置放置ToastReceiver组件。

<template>
    <div>
        <ToastReceiver @close="event" @life-end="event"/>
        <!-- or just  <ToastReceiver/>-->
        <slot/>
    </div>
</template>

<script lang="ts">
    import {defineComponent} from "vue";
    import {ToastReceiver} from 'laraveltoolkit';
    import {Message} from "laraveltoolkit/resources/js/Flash";

    export default defineComponent({
        name: "Flash",
        components: {
            ToastReceiver,
        },
        mounted() {

        },
        methods: {
            event(message: Message) {
                console.log(message)
            }
        }
    });
</script>

链接

提供了一种能够在子域名之间进行路由的扩展。

在Vue组件中,当href指向另一个域名时,它将使用html默认链接而不是Inertia链接

<template>
<!--  Use a Inertia component -->
    <Link :href="route('index')">Same domain</Link>
    
<!--  Use a <a/> element -->
    <Link :href="route('another.domain')">Another domain</Link>
</template>

<script lang="ts">
import {defineComponent} from "vue";
import {Link} from "laraveltoolkit";

export default defineComponent({
    name: "LinkComponent",
    components: {
        Link,
    }
    
});
</script>

要执行POST和其他需要发送数据的操作,您需要配置meta csrf以使请求成功

<meta name="csrf-token" content="{{ csrf_token() }}">

此外,默认情况下,此包扩展了Laravel Redirector类,以便在从Inertia发出请求时将重定向到另一个域名。您可以在配置文件中禁用此行为。

SEO

提供了一种简单的方法在您的应用程序中使用SEO。

use Illuminate\Http\Request;
use Inertia\Response;
use LaravelToolkit\Facades\SEO;
use LaravelToolkit\SEO\Image;

class ExampleController
{
    /**
     * Handle the incoming request.
     */
    public function __invoke(Request $request): Response
    {
        SEO::withTitle('Client Orders')
            ->withoutDescription('A long description of this page')
            ->withCanonical('https://foo.com')
            ->withOpenGraphImage(new Image('public', 'seo.webp'))
            ->withTwitterCardImage(new Image('public', 'seo.webp', 'alt title'));
            
        // If you want to remove a property you can call methods prefixed with `without`
        SEO::withoutOpenGraphImage();
            
        return Inertia::render('Example');
    }
}

在您的视图vue seo blade组件,这将适用于非JS爬虫

<head>
    ...
    <x-seo/>
    ...
</head>

在您的Vue布局中加载Head组件,以在页面间导航时更新head属性。

<template>
    <div>
        <Head/>
    </div>
</template>

<script lang="ts">
    import {defineComponent} from "vue";
    import {Head} from "laraveltoolkit";

    export default defineComponent({
        name: "TestLayout",
        components: {
            Head,
        }
    });
</script>

SEO外观还提供了一些实用方法

use LaravelToolkit\Facades\SEO;

// Returns true if request agent is a crawler
SEO::isCrawler();
// or
SEO::isCrawler('user agent');

// Transform a human string into a pretty wrote url string
SEO::friendlyUrlString('A example of string!')
// returns 'a-example-of-string'

站点地图

提供了一种通知搜索引擎您的网站页面的方法。

在routes/sitemap.php(发布后)

use App\Models\User;
use LaravelToolkit\Facades\Sitemap;

// You can pass only url
Sitemap::addUrl(route('index'));
// Or a complete info (url, last modified, change frequency and priority
Sitemap::addUrl(route('login'), today()->subDay(), ChangeFrequency::DAILY, 0.5);

// You can interact with queries or collections
Sitemap::fromQuery(User::query(), function (User $user) {
    Sitemap::addUrl(route('index.user', $user->id), $user->created_at);
});
Sitemap::fromCollection(collect([10, 53, 29]), function (User $user) {
    Sitemap::addUrl(route('index.user', $user->id));
});

// A group of sitemaps that only will return if domain matches. Other registries out from this group will be ignored
Sitemap::domain('abc.dev.test', function () {
    Sitemap::addUrl(route('login'));
});

// An index group used for huge sitemaps with more than 50k rows or 50MB
Sitemap::index('users', function () {
 
    Sitemap::fromQuery(User::query(), function (User $user) {
        Sitemap::addUrl(route('index.user', $user->id), $user->created_at);
    });
});
// will be accessible on `route('lt.sitemap_group', "users");`

// then to put this index on main sitemap use:
Sitemap::addIndex('users');

测试

composer test

更改日志

请参阅更改日志以获取有关最近更改的更多信息。

贡献

请参阅贡献指南以获取详细信息。

安全漏洞

请参阅我们的安全策略以了解如何报告安全漏洞。

致谢

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。