使用 url 创建 yii2 动态页面:www.example.com/pageName

2024-01-04

在我的系统中,用户需要有他们的个人资料页面。我要求这些页面将显示在 url 中,如下所示:

www.example.com/John-Doe

www.example.com/Mary-Smith

如何在 yii2 中实现这些 URL?这些 John-Doe 和 Mary-Smith 可以是用户用户名或个人资料名称。例如,我在用户表中有一个名为“name”的字段,它将保存名称“John Doe”、“Mary Smith”。请注意,我需要带有“-”而不是空格的 SEO 友好 URL。

像这样的网址: www.example.com/profile/view?id=1 不是一个选择。


www.example.com/John-Doe

www.example.com/Mary-Smith

我认为没有正常的方法来使用这些网址,因为首先控制器(在你的情况下它是ProfileController)需要确定。从这些网址来看这是不可能的。

您提供的网址的第二个问题 - 无法保证唯一性。如果另一个用户同名怎么办John Doe会现场报名吗?

例如,查看您在 Stack Overflow 上的个人资料链接:

http://stackoverflow.com/users/4395794/black-room-boy

它不是http://stackoverflow.com/black-room-boy甚至没有http://stackoverflow.com/users/black-room-boy.

组合id and name是更广泛、更稳健的方法。它们也可以与破折号结合使用,如下所示:http://stackoverflow.com/users/4395794-black-room-boy

Yii 2 有内置的行为,称为Sluggable行为 http://www.yiiframework.com/doc-2.0/yii-behaviors-sluggablebehavior.html.

将其附加到您的模型:

use yii\behaviors\SluggableBehavior;

public function behaviors()
{
    return [
        [
            'class' => SluggableBehavior::className(),
            'attribute' => 'name',
            // In case of attribute that contains slug has different name
            // 'slugAttribute' => 'alias',
        ],
    ];
}

对于您的特定网址格式,您还可以指定$value:

'value' => function ($event) {
    return str_replace(' ', '-', $this->name);
}

这只是生成自定义 slug 的示例。根据你的情况改正name保存前的属性特征和验证/过滤。

另一种实现唯一 url 的方法是设置$ensureUnique http://www.yiiframework.com/doc-2.0/yii-behaviors-sluggablebehavior.html#%24ensureUnique-detail财产给true.

所以如果是John-Doe存在John-Doe-1会生成slug等等。

请注意,您还可以通过设置来指定自己独特的生成器$uniqueSlugGenerator http://www.yiiframework.com/doc-2.0/yii-behaviors-sluggablebehavior.html#%24uniqueSlugGenerator-detail可调用。

我个人不喜欢这种方法。

如果您选择与 Stack Overflow 使用的选项类似的选项,请将其添加到您的 url 规则中:

'profile/<id:\d+>/<slug:[-a-zA-Z]+>' => 'profile/view',

In ProfileController:

public function actionView($id, $slug)
{
    $model = $this->findModel($id, $slug);
    ...
}

protected function findModel($id, $slug)
{
    if (($model = User::findOne(['id' => $id, 'name' => $slug]) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('User was not found.');
    }
}

但实际上id足以找到用户。如果您使用正确的方式访问,Stack Overflow 会重定向id但不同slug。当您也完全跳过名称时,就会发生重定向。

例如http://stackoverflow.com/users/4395794/black-room-bo重定向到原始页面http://stackoverflow.com/users/4395794/black-room-boy以避免 SEO 不希望出现的内容重复。

如果你也想使用这个,请修改findModel()像这样的方法:

protected function findModel($id)
{
    if (($model = User::findOne($id) !== null) {
        return $model;
    } else {
        throw new NotFoundHttpException('User was not found.');
    }
}

And actionView()像这样:

public function actionView($id, $slug = null)
{
    $model = $this->findModel($id);
    if ($slug != $model->slug) {
        return $this->redirect(['profile/view', ['id' => $id, 'slug' => $model->slug]]);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 url 创建 yii2 动态页面:www.example.com/pageName 的相关文章

  • 如何在 Python 中包含 PHP 脚本?

    我有一个 PHP 脚本 news generator php 当我包含它时 它会抓取一堆新闻项并打印它们 现在 我在我的网站 CGI 中使用 Python 当我使用 PHP 时 我在 新闻 页面上使用了这样的内容 为了简单起见 我删掉了这个
  • Smarty输出空白页

    已解决 模板文件错误 我有这样的 Smarty 设置 require once smarty Smarty class php smarty new Smarty smarty gt compile dir compile dir smar
  • PHP - 获取base64图像字符串解码并保存为jpg(生成空图像)

    嗨 我实际上是通过 ajax 发送一个 base64 图像字符串到一个 php 脚本 该脚本只是解码字符串并将内容保存为 jpg 文件 但结果是一张空图像 这怎么可能 PHP脚本 uploadedPhotos array photo 1 p
  • 从 octobercms 中的非 ajax 表单获取输入值

    我正在尝试构建一个简单的搜索功能 下面是我的搜索表格
  • PHP 或 WAMP 不确定是什么

    我已经安装了 WAMP 服务器 2 0 PHP 5 4 3 安装WAMP后我已经重新启动了所有服务并且可以打开 phpinfo 显示良好 phpmyadmin 它也显示得很好 我可以使用数据库 然而 当在 Chrome 中运行简单的 php
  • 在 Laravel 5 中截断表

    描述 我有一个充满测试数据的表 有时 我想清除它以获取新数据 我可以在 DBMS 应用程序中执行截断 例如MySQL 工作台 但我试图在我的应用程序中实现它 Goal 创建一个按钮 单击时截断数据库中的表 这是我的步骤 1 声明一条路线 R
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 如何通过php的require()或include()函数传递变量?

    当我使用这个时 require diggstyle code php page page no 警告是 无法打开流 第 198 行 C xampp htdocs 4ajax gallery core php 中没有错误 错误是 Failed
  • 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

    我想允许用户从两个不同的模型登录 配置文件 user gt identityClass gt app models User one more class here enableAutoLogin gt false authTimeout
  • postgreSql 中特定时间后表更新

    我已经在 postgres 中创建了表 现在我想在特定时间 例如 1 小时 后更新一行 我看到很多问题 例如 https dba stackexchange com questions 56424 column auto updated a
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • Joomla 页面中的自定义 php 代码

    我正在尝试将 Joomla 1 5 9 页面中的表源从页面中的硬编码 html 更改为从 SQL 数据库获取信息 执行此操作的正确方法是什么 创建一个新的模型或组件并以某种方式在页面中使用它 我找到了这些 http docs joomla
  • 如何在 OS X 上使用 OpenSSL 1.0.1 编译 PHP 5.5.19

    我已经安装了 OpenSSL 1 0 1j usr local ssl现在我尝试使用此版本的 OpenSSL 编译 PHP 5 5 19 这是我的配置过程 export CFLAGS arch x86 64 export CXXFLAGS
  • 检查条件并通过 Zend 中的 Regex 识别 url 中的模式

    我正在实现 Zend Regex 路由 并且必须对 url 执行多次检查 例如 如果这是我的网址 http localhost application public index php module controller action 这是
  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入

随机推荐