我有一个带有前端和后端的yii高级应用程序。
我尝试实现的是我可以使用客户的名称访问前端。
示例(本地):http://localhost/myproject/frontend/web/customer1
首次访问时应成为http://localhost/myproject/frontend/web/customer1/site/login
登录后,客户名称应保留在URL中。登录到http://localhost/myproject/frontend/web/
的信息:
customer
是GET参数。它应始终是http://localhost/myproject/frontend/web/
之后的第一个参数,但我不想在每个重定向或自定义链接中指定参数。我希望有一种方法可以保留这个参数并将其传递给以下每个站点更改。
到目前为止我尝试过:
'urlManager' => [
'class' => 'yii\web\UrlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'enableStrictParsing' => true,
'rules' => [
'<controller>/<action>' => '<controller>/<action>',
'<customer:\w+>' => '/site/login',
]
],
但这不起作用。我只能访问登录页面,之后客户名称不再显示在URL中。
我的.htaccess文件如下所示:
RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php
我非常感谢有关此主题的任何提示。
答案 0 :(得分:1)
要将客户名称添加到所有网址,请修改您的网址规则:
<customer:\w+>/<controller>/<action>' => '<controller>/<action>,
如果您现在拨打yii\helpers\Url::to(['site/index', 'customer' => 'customer'])
,则输出结果将符合您的要求 - /customer/site/index
。
如何在整个项目中调用它并不是灵活的方法。
大多数时候Url::to()
方法用于生成内部网址。
如果您在$route
中传递数组,则会调用Url::toRoute()
。因此,您只需在自定义组件中覆盖该方法即可。
namespace frontend\components;
use yii\helpers\Url as BaseUrl;
class Url extends BaseUrl
{
public static function toRoute($route, $scheme = false)
{
$customer = ... // Get saved after login customer name (for example from the session)
$route['customer'] = $customer;
return parent::toRoute($route, $scheme);
}
}
然后,您只需致电frontend\components\Url::to(['site/index'])
即可获得相同的结果。
自定义官方文档here中描述的帮助程序类的替代方法。
<强>更新强>
此网址规则'<customer:\w+>' => '/site/login',
也是多余的,网址应该只是site/login
,因为登录前的任何用户都是访客。