萨迈耶 / yii2-advanced-template
一个令人惊叹的模板。
Requires
- php: >=5.4.0
- bower-asset/jquery: ~1.11@stable
- bower-asset/jquery-ui: ~1.11@stable
- fxp/composer-asset-plugin: 1.0.*@dev
- yiisoft/yii2: *
- yiisoft/yii2-bootstrap: *
- yiisoft/yii2-imagine: *
- yiisoft/yii2-jui: *
- yiisoft/yii2-mongodb: *
- yiisoft/yii2-swiftmailer: *
Requires (Dev)
This package is not auto-updated.
Last update: 2024-09-24 02:57:45 UTC
README
这是我决定发布的Yii 2高级应用的模板。
但是为什么呢?
也许它能帮助到某人。
这个模板是从多个项目演变而来的,包括一个电子商务网站。它涵盖了我在这些项目之间不断实现的一些常见功能。
我似乎总是在重复做一些事情,所以我试图解决这个问题。它融合了我个人认为的良好结构。
首先,我将谈谈结构,然后我会深入探讨我所做的事情。我将尽量简洁地解释,但很可能会遗漏一些东西。
本指南适用于已经了解Yii 2和正常高级应用结构的开发者。如果您不是这样的人,请先查看高级应用README。
目录结构
common
components/ contains all of the extended components of the framework
config/ contains shared configurations
mail/ contains view/template files for e-mails
rbac/ contains the role based permissions configuration
models/ contains model classes used in both backend and frontend
tests/ contains various tests for objects that are common among applications
widgets/ contains widgets common to both back and front end
console
config/ contains console configurations
controllers/ contains console controllers (commands)
migrations/ contains database migrations
models/ contains console-specific model classes
runtime/ contains files generated during runtime
tests/ contains various tests for the console application
backend
assets/ contains application assets such as JavaScript and CSS
config/ contains backend configurations
controllers/ contains Web controller classes
models/ contains backend-specific model classes (Does not actually exist)
runtime/ contains files generated during runtime
tests/ contains various tests for the backend application
views/ contains view files for the Web application
web/ contains the entry script and Web resources
frontend
assets/ contains application assets such as JavaScript and CSS
config/ contains frontend configurations
controllers/ contains Web controller classes
models/ contains frontend-specific model classes (Does not actually exist)
runtime/ contains files generated during runtime
tests/ contains various tests for the frontend application
views/ contains view files for the Web application
web/ contains the entry script and Web resources
vendor/ contains dependent 3rd-party packages
environments/ contains environment-based overrides
结构更改
目录结构略有变化,变为经过测试的版本,效果相当好。主要变化是将内容移动到common/
文件夹。 common/
包含应用全局共有的所有内容。
common/components/
components/
包含所有扩展的Yii 2组件,例如自定义的Controller
、User
和Request
对象。
您可以将扩展放在这里,但您可能会发现将它们放在extensions/
文件夹中更好,这完全取决于您的判断。
common/mail/
此文件夹包含所有邮件相关内容,从模板到视图文件。
邮件模板和视图严格属于整个应用。
common/rbac/
此文件夹包含RBAC配置,包括规则类。
这同样是整个应用的全局内容。
common/models/
我将所有模型放置在common/models
中,包括SignupForm.php
、PasswordResetRequestForm.php
和ResetPasswordForm.php
。
添加这些通常属于前端模型的理由是,我发现它们越来越多地也被后端使用。您希望公司的员工能够在后端注册并重置密码,而无需在两个系统之间跳转;尤其是如果他们是第一天上班的新员工,需要在您的系统中注册新账户。
这意味着后端和前端中的models/
文件夹实际上并不存在,但如果您确实需要,它们可以存在。
common/widgets/
此文件夹包含全局小部件。
您可能会发现一些小部件实际上属于整个应用的全局内容,例如:我已经将Alert
小部件添加为全局小部件,并将其添加到前端和后端布局中。
frontend/models/
现在已移动到common/models
。
backend/models/
现在已移动到common/models
。
Composer
Composer已更改。默认安装的内容已扩展和/或更改。
默认情况下,Composer将下载MongoDB扩展。我稍后会解释如何去除它,实际上只需修改3行代码。
以下是composer中的变更列表,简要但全面。
yii2-mongodb
已添加,并成为应用程序的默认数据库。- jQuery 安装了一个符合 IE 8 和 9 的版本。
- jQuery UI 安装了一个符合 IE 8 和 9 的版本。
- 添加了
yii2-jui
扩展。 - 添加了
yii2-imagine
以提供图像处理能力。
配置
在开始修改之前,理解配置及其布局非常重要。
大部分配置放在 common/config/main.php
中,然而,在 backend/config/main.php
和 frontend/config/main.php
中存在大量自定义配置。
common/config/main.php
包含以下内容
- URL 管理器
- 用户
- 会话
- 缓存
- 请求
- 邮件发送器
- 资产管理者
- RBAC
资产管理者配置允许您使用自定义的Bootstrap和相应的主题CSS。
RBAC配置允许使用在此模板中设置的默认RBAC,请参考下面的RBAC部分。
其他部分不是那么重要,基本上都按照其名称执行。请确保仔细查看配置文件,以及这些目录中的 params.php
文件。
params.php
文件通常包含一些有用的变量。目前这些文件相当简单,所以如果您以后没有再次听到关于它们的消息,请不要感到惊讶。
一些配置也定义在环境文件夹中,例如数据库:SQL和MongoDB都在环境文件夹自己的配置文件中定义。
控制器
所有控制器现在都继承自 common\components\Controller
,它提供了第二层功能以及SSL重定向,稍后会进行讨论。
common\components\Controller
类运行一个 beforeAction
事件,可以扩展为您的自定义功能。
特性
common\models\Request
CSRF 路由
我发现在实际生产环境中,每次操作都存在的CSRF问题越来越多,尤其是在电子商务网站上。主要问题在于并非每个人都在网站上使用CSRF令牌,尤其是当他们来自像Google AdWords或电子邮件这样的营销活动时。
随着时间的推移,我发现我实际上想要默认禁用CSRF,然后在可能不安全的页面上启用它。
这比在整个控制器上禁用CSRF更加精细,目前这是唯一的其他选项。
以下是从 frontend/config/main.php
中摘取的示例
'request' => [
'class' => 'common\components\Request',
'enableCsrfValidation' => true,
'csrfRoutes' => [
'site/login',
'site/signup',
'site/request-password-reset',
'site/reset-password',
'site/confirm-login'
]
],
上述配置将使CSRF仅在那些路由上工作。同时定义 enableCsrfValidation
也很重要,以确保它能够在Yii 2中正常工作。
SSL 路由
当您的网站无法完全使用SSL运行时,您可能希望定义某些路由为仅SSL,例如:使用此模板,您可能希望定义 site/login
、site/signup
和 user/index
为SSL路由。
就像上面的CSRF路由一样,您可以通过在请求配置中填充 sslRoutes
属性来定义这些路由。
SSL路由将在 common\components\Controller
的 beforeAction
事件中进行重定向。
第二层登录
第二层登录对于希望保持用户登录状态但又不希望他们能够未安全登录就下订单的电子商务网站非常有帮助。
您可以在本地亚马逊网站上看到一个例子,以我的情况为例,是Amazon.co.uk。它会保持您的登录状态,但当您尝试购买商品时,它会要求您输入密码。
这些登录默认在后台被禁用,但在前端通过frontend/config/main.php
中的配置被启用。
'user' => [
'enableTier2' => true,
'tier2Timeout' => 3600 /* 10 mins */
]
如您所见,配置应用于用户对象。默认情况下,该应用模板中的用户组件是common\components\User
。
当您登录时,它将设置一个包含超时时间(默认为10分钟)的会话变量,并且只要您在指定的时间内(在这种情况下为10分钟)继续浏览网站,这个超时时间将继续增长。
当用户10分钟内没有活动时,它将继续保持他们的登录状态并允许他们执行某些操作,但如果他们触发了您定义为2级的行为,他们将被要求登录。
例如,在frontend/controllers/UserController.php
文件中,您可能看到
public function behaviors()
{
return [
'access' => [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['subscribe'],
'roles' => ['?']
],
[
'allow' => true,
'actions' => ['index', 'recent-orders', 'change-password'],
'roles' => ['tier2User']
],
[
'allow' => true,
'roles' => ['user']
],
],
],
];
}
tier2User
角色与RBAC相关,并在common/rbac/Tier2Rule.php
中运行规则。
如果发现用户没有以2级登录,他们将被重定向到site/confirm-login
。
RBAC
现有的RBAC是通过common\components\PhpManager
实现的,本质上是通过向用户添加包含角色的角色字段。
然后,该角色与common/rbac/items.php
文件相关联,可以包含其他角色的继承。
我发现这种RBAC很容易应用于许多网站,无需太多努力,即使是电子商务网站。
这个应用模板附带的RBAC有六个角色
- guest:您的大多数用户
- user:已登录的用户
- tier2user:用于2级登录
- staff:是员工但无权使用许多管理功能的人
- admin:网站的管理员
- god:通常是你
默认情况下应用于所有新用户的角色将是user
,并且它将以全文形式保存到记录中,如下所示(来自MongoDBB)
{ "_id" : ObjectId("543e94856803fab5038b4570"), "username" : "sammaye", "status" : NumberLong(10), "role" : "user", "created_at" : NumberLong(1413387397), "updated_at" : NumberLong(1413394841) }
默认情况下,您的网站任何未登录用户都将被应用guest
角色。
自定义Bootstrap资源
前端和后端都有自己的Bootstrap,分别位于各自的web
文件夹中。
我认为这是最好的选择,因为我总是想将自己的变量和主题应用到Bootstrap上,因此您应该对其有所控制。
这由common/config/main.php
文件中的配置提供便利
'assetManager' => [
'bundles' => [
'yii\bootstrap\BootstrapAsset' => [
'basePath' => '@webroot',
'baseUrl' => '@web',
'sourcePath' => null,
],
'yii\bootstrap\BootstrapPluginAsset' => [
'basePath' => '@webroot',
'baseUrl' => '@web',
'sourcePath' => null,
]
],
]
并且存在于资源压缩器配置文件中。
压缩资源
frontend/config/assets.php
中放置了一个示例文件,该文件将与资源压缩器命令一起工作,允许您压缩资源。
这将反过来压缩到common/wigets/AllAssets.php
文件中定义的规范。
通过电子邮件地址登录
我已经将登录表单更改为通过电子邮件地址而不是用户名来工作。这似乎更适合许多网站,因为在很多情况下您实际上并不需要用户名。
注册、登录和重置密码
所有正常用户功能,包括
- 注册
- 登录
- 以及,重置密码
都存在于前端和后端。如上所述在“common/models”部分,我发现我一次又一次地想要在前后端都包含这些,而不仅仅是前端。
移除MongoDB
您可以通过从composer中删除扩展行然后运行来轻松地从模板中移除MongoDB。
php ./composer.phar update
之后,使用“grep”搜索 yii/mongodb/ActiveRecord
并将其替换为 yii/db/ActiveRecord
。