YII2 AssetBundle 不同的页面加载不一样的前端文件 [ 新手入门 ]
有2需求 1、我有页面 index.php?r=site/index 还有 index.php?r=site/error 等多个页面 如果每个页面加载的前端文件都一样会非常浪费资源,另外有些前端文件会彼此影响可能还出现错误,这该如何是好? 如何让这些页面根据需要去加载前端文件呢?
2、另外我还想在用 composer 更新我系统的时候,这些前端文件也跟着更新?这该如何是好?
可行方案举例
backend/asset/Myasset.php
<?php
namespace backend\assets ;
use yii\base\Exception;
use yii\web\AssetBundle as BaseAdminLteAsset;
class Myasset extends BaseAdminLteAsset
{
public $sourcePath = '@bower';
public $css = [
'bootstrap/dist/css/bootstrap.min.css',
];
public $js = [];
public $depends = [
'backend\assets\AppAsset',
'backend\assets\YiiAsset',
];
/**
* @inheritdoc
*/
public function init()
{
$action_id = \Yii::$app->controller->action->id ;
if ($action_id =='error') {
$this->depends[] = 'backend\assets\ErrorAsset';
} else {
$this->depends[] = 'backend\assets\CssJsAsset';
}
parent::init();
}
}
?>
backend/asset/ErrorAsset.php
<?php
namespace backend\assets ;
use yii\web\AssetBundle;
class ErrorAsset extends AssetBundle
{
public $sourcePath = '@bower';
public $css = [
'font-awesome/css/font-awesome.min.css',
];
public $js =[
'adminedd/dist/js/111.js',
'adminedd/dist/js/222.js',
];
}
?>
backend/asset/CssJsAsset.php
<?php
namespace backend\assets ;
use yii\web\AssetBundle;
class CssJsAsset extends AssetBundle
{
public $sourcePath = '@bower';
public $css = [
'font-awesome/css/font-awesome.min.css',
'font-awesome/css/ssddd.css',
];
public $js =[
'adminedd/dist/js/111.js',
'adminedd/dist/js/222.js',
'adminedd/dist/js/444.js',
'adminedd/dist/js/444.js',
];
}
?>
backend/views/layouts/main.php
<?php
...
backend\assets\Myasset::register($this);
...
?>
前端工具直接都下载到 @bower (vendor/bower) 文件夹下
composer.json
...
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.6",
"bower-asset/Font-Awesome": "*",
"bower-asset/ionicons": "*"
},
...
注:跟着测试有问题留言
共 4 条回复
-
-
-
if ($action_id =='error') { $this->depends[] = 'backend\assets\ErrorAsset'; } else { $this->depends[] = 'backend\assets\CssJsAsset'; }
这里 $action_id =='error',建议使用依赖注入(DI),在 new 的时候传入配置参数,根据参数判断依赖的 asset,采用这种方式来达到 松耦合。
共 2 条回复额忘记了 AssetBundle 的实例化方式是通过 register 静态方法在视图中注册,也就是说没法在 new 的时候传入配置参数。
那么只好用一种相当 low 的方式,就是添加一个静态属性,在视图中设置它,在 bundle 的 init 方法里根据这个属性来判断添加那个依赖。AppAsset.php
class AppAsset extends AssetBundle { public static $group; .... public function init() { if(self::$group == 'error') { ..... } } }
view.php
use app\assets\AppAsset; AppAsset::$group = 'error'; AppAsset::register($this);
feng18 觉得很赞 -
qiuxis
注册时间:2016-10-31
最后登录:2017-10-25
在线时长:22小时6分
最后登录:2017-10-25
在线时长:22小时6分
- 粉丝21
- 金钱215
- 威望40
- 积分835