vlados/laravel-unique-urls

Laravel 中每个 Eloquent 模型使用和生成唯一 URL 的包

v0.4.1 2024-05-17 21:02 UTC

This package is auto-updated.

Last update: 2024-09-27 07:07:55 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads PHP Insights PHPStan

为博客、电子商务和平台生成不带前缀的唯一 URL。Laravel

目标

  • 当创建或更新模型时,根据每个模型中 urlStrategy() 函数生成唯一 URL
  • 可以为不同语言设置不同的 URL(不仅仅是开始时的前缀)
  • 如果 URL 已存在,则创建新的 URL,后缀为 _1、_2 等。
  • 如果我们更新模型以从旧 URL 重定向到新 URL
  • 如果有多个重定向,则只重定向到最后一个
  • 根据关系(类别名称/产品名称)设置 URL 的可能性

安装

您可以通过 composer 安装此包

composer require vlados/laravel-unique-urls

您可以使用以下命令发布和运行迁移

php artisan vendor:publish --tag="laravel-unique-urls-migrations"
php artisan migrate

使用

配置

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

php artisan vendor:publish --tag="laravel-unique-urls-config"

将创建 unique-urls.php,如下所示

return [
    // Locale => $language
    'languages' => [
        'bg_BG' => 'bg',
        'en_US' => 'en',
        'de_DE' => 'de',
    ],
    'redirect_http_code' => 301,
];

准备你的模型

在你的模型中添加以下方法

class MyModel extends Model
{
    use Vlados\LaravelUniqueUrls\HasUniqueUrls;

    public function urlStrategy($language,$locale): string
    {
        return Str::slug($this->getAttribute('name'),"-",$locale);
    }
    
    public function urlHandler(): array
    {
        return [
            // The controller used to handle the request
            'controller' => CategoryController::class,
            // The method
            'method' => 'view',
            // additional arguments sent to this method
            'arguments' => [],
        ];
    }

处理请求的方法

public function view(Request $request, $arguments = [])
{
    dd($arguments);
}

路由

最后,在 routes/web.php 文件的末尾添加以下行

Route::get('{urlObj}', [\Vlados\LaravelUniqueUrls\LaravelUniqueUrlsController::class, 'handleRequest'])->where('urlObj', '.*');

批量导入

例如,如果您有类别树并且需要在创建 URL 之前导入所有数据,您可以在模型创建时禁用自动生成 URL。要禁用自动生成 URL,请覆盖模型中的 isAutoGenerateUrls 方法

public function isAutoGenerateUrls(): bool
{
    return false;
}

并在稍后按如下方式调用 generateUrl()

YourModel::all()->each(function (YourModel $model) {
    $model->generateUrl();
});

或者,如果您想即时禁用它,请使用

$model = new TestModel();
$model->disableGeneratingUrlsOnCreate();
$model->name = "Test";
$model->save();

Livewire

要使用 Livewire 全页面组件 来处理请求,首先在模型中的 urlHandler() 函数中设置

public function urlHandler(): array
{
    return [
        // The Livewire controller
        'controller' => CategoryController::class,
        // The method should be empty
        'method' => '',
        // additional arguments sent to the mount() function
        'arguments' => [],
    ];
}

示例 livewire 组件

class LivewireComponentExample extends Component
{
    private Url $urlModel;
    private array $url_arguments;

    public function mount(Url $urlObj, $arguments = [])
    {
        $this->urlModel = $urlObj;
        $this->url_arguments = $arguments;
    }

    public function render()
    {
        return view('livewire.view-category');
    }
}

API

命令

urls:generate

此命令为指定的模型或实现 HasUniqueUrls 特性的应用程序中所有模型生成唯一 URL。

使用

php artisan urls:generate [--model=ModelName] [--fresh] [--only-missing]

urls:doctor

此命令检查应用程序中的所有模型是否已正确实现 HasUniqueUrls 特性和所需函数。

使用

php artisan urls:doctor [--model=ModelName]

检查

  • 检查是否所有方法都使用正确的参数实现
  • 检查 urlHandler 是否返回正确的控制器和方法
  • 检查 urlStrategy 是否为所有语言生成唯一 URL

测试

composer test

变更日志

请参阅 CHANGELOG 了解最近更改的更多信息。

贡献

语义提交消息

了解如何通过修改提交消息样式来提高您作为程序员的水平。格式:<type>(<scope>): <subject>

<scope> 是可选的

feat: add hat wobble
^--^  ^------------^
|     |
|     +-> Summary in present tense.
|
+-------> Type: chore, docs, feat, fix, refactor, style, or test.

更多示例

  • feat: (为用户提供的新功能,而不是为构建脚本添加新功能)
  • fix: (对用户而言的 bug 修复,而不是对构建脚本的修复)
  • docs: (对文档的更改)
  • style: (格式化、缺少分号等;没有生产代码更改)
  • refactor: (重构生产代码,例如重命名变量)
  • test: (添加缺少的测试、重构测试;没有生产代码更改)
  • 任务: (更新Grunt任务等;不修改生产代码)

参考资料

安全漏洞

请查阅我们如何报告安全漏洞的安全策略

致谢

许可证

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