wsssoftware / laraveltoolkit
一个包含基本工具的Laravel Toolkit
Requires
- php: ^8.3
- ext-dom: *
- illuminate/contracts: ^11.0
- jaybizzle/crawler-detect: ^v1.2.119
- spatie/laravel-package-tools: ^1.16
Requires (Dev)
- ext-intl: *
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1
- orchestra/testbench: ^9.0.0
- pestphp/pest: ^2.34
- pestphp/pest-plugin-arch: ^2.7
- pestphp/pest-plugin-laravel: ^2.3
- spatie/laravel-ray: ^1.35
This package is auto-updated.
Last update: 2024-09-27 23:37:58 UTC
README
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)。请参阅许可证文件以获取更多信息。