webfactory/slug-validation-bundle

在 Symfony 应用程序中透明验证 URL 别名的有效性。

0.6.0 2024-04-22 12:17 UTC

README

Build Status Coverage Status

不要让你的控制器动作中充斥着 URL 别名的验证:这个 Symfony 扩展包帮助您透明地验证对象别名。

  • 检查别名是否有效(如果提供的话)
  • 在失败时重定向到带有正确别名的 URL(例如在别名更改后)

动机

URL 别名的处理是许多 Web 应用的一个组成部分。虽然可读的 URL 很好,但它们通常不会对您的主要功能做出贡献。相反,别名验证和在失败情况下的重定向会在您的控制器动作中产生大量噪音,通常会在应用的许多部分中变得杂乱,使您更难看到解决的问题的核心。

面对这些问题多次后,我们决定创建一个系统,该系统将别名验证作为中间件的一部分来处理,从而使您的控制器动作保持整洁,并让您集中精力解决真正重要的问题:您的主域问题。

安装

通过 Composer 安装该扩展包

composer require webfactory/slug-validation-bundle

在您的内核中启用扩展包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new \Webfactory\SlugValidationBundle\WebfactorySlugValidationBundle(),
        // ...
    );
    // ...
}

使用方法

前提条件:为了能够使用此扩展包提供的别名验证,您必须通过 参数转换器 加载您的可别名对象。对于 Doctrine 实体,Symfony 内置了此功能。

通过参数转换器请求您的实体

声明您的对象为控制器动作参数

public function myAction(MyEntity $entity)
{
}

当使用 Doctrine 实体时,您的路由参数 entity 必须包含实体 ID 以使此功能正常工作。

实现可别名接口

通过实现 \Webfactory\SlugValidationBundle\Bridge\SluggableInterface 来提供实体有别名且可以被验证的提示

class MyEntity implements SluggableInterface
{
    /**
     * @return string|null
     */
    public function getSlug()
    {
        return 'my-generated-slug';
    }
}

将别名参数添加到路由中

声明一个包含 entitySlug 参数并指向您动作的路由

my_entity_route:
    path: /entity/{entitySlug}.{entity}
    defaults:
        _controller: MyBundle:MyController:my

就是这样!每次使用可别名实体与路由中的别名参数一起使用时,此扩展包都会介入并执行验证。如果别名无效,则将启动重定向到相同路由且带有纠正后的别名。

附加信息

实体和别名参数按照约定进行匹配:别名参数必须使用后缀 Slug。例如,blogPost 参数的正确参数名称为 blogPostSlug

如果路由包含可别名实体但没有别名参数,则不会发生任何事情,因此不会更改 Symfony 的常规行为。

别名生成

如果您不确定如何创建别名,那么您可能发现 cocur/slugify 很有用。该组件可以从任何字符串生成 URL 别名。

简化路由

在生成路由时传递别名值可能是一项繁琐且容易出错的任务。webfactory/object-routingwebfactory/object-routing-bundle 可以通过直接使用实体定义路由构造规则来简化这项任务。

/**
 * @ObjectRoute(type="my_object_route", name="my_entity_route", params={
 *     "entity": "id",
 *     "entitySlug": "slug"
 * })
 */
class MyEntity implements SluggableInterface
{
    public function getId() 
    {
        // ...
    }
    
    public function getSlug() 
    {
        // ...
    }
    
    // ...
}

在生成 URL 时,您不再需要处理这些参数(例如在 Twig 中)

{{ object_path('my_object_route', myEntityInstance) }}

致谢、版权和许可

此项目始于 webfactory GmbH,波恩。

版权 2016-2019 webfactory GmbH,波恩。代码在 MIT 许可证 下发布。