我有一个我正在学习的课程,它允许您创建一个资产数组,如下所示:
array(
'css' => array(
array('name' => 'bla'),
array('name' => 'bla2')
),
'js' => array(
array('name' => 'bla.js'),
array('name' => 'bla2.js')
)
);
此类然后解析这些并呈现出来,您将执行以下操作:
$assets = new AssetLoader(array(
'css' => array(
array('name' => 'bla'),
array('name' => 'bla2')
),
'js' => array(
array('name' => 'bla.js'),
array('name' => 'bla2.js')
)
));
$assets->renderAssets();
因此,假设您在应用程序的 header.php 中执行此操作,您现在有两个 css 文件和两个 js 文件。
如果你想创建新资产,你会这样做:
$assets->createAssets('css', array('name' => 'bla3'));
createAssets 的问题是:
- 它创建资产,
bla3
作为 js 和 css 资产,而实际上您是在告诉它创建一个新的 css 资产。 - 您只能在上面执行此操作
renderAssets();
,这是一个问题,您应该能够在应用程序的任何位置执行此操作,因此名称为:createAssets()
这是我的课:
<?php
class AssetLoader {
private $assets;
private $cssAssets;
private $jsAssets;
public function __construct(array $assets){
$this->assets = $assets;
$this->seperateAssets($this->assets);
}
public function renderAssets(){
$this->renderCss();
$this->renderJs();
}
public function createAssets($type, array $assets){
if(isset($this->assets[$type])){
array_push($this->assets[$type], $assets);
$this->seperateAssets($this->assets);
}
}
protected function renderCss(){
foreach($this->processCss() as $css){
echo $css;
}
}
protected function renderJs(){
foreach($this->processJs() as $js){
echo $js;
}
}
protected function processCss(){
$html = array();
foreach($this->cssAssets as $assetName){
foreach($assetName as $name=>$location){
$html[] = '<link rel="stylesheet" type="text/css" name="'.$name.'" href="'.$location.'" />';
}
}
return $html;
}
protected function processJs(){
$html = array();
foreach($this->cssAssets as $assetName){
foreach($assetName as $name=>$location){
$html[] = '<script type="text/javascript" name="'.$name.'" src="'.$location.'"></script>';
}
}
return $html;
}
private function seperateAssets(array $assets){
$this->seperateCss($assets);
$this->seperateJs($assets);
}
private function seperateCss($assets){
foreach($assets as $key=>$value){
if($key == 'css'){
$this->cssAssets = $value;
}
}
}
private function seperateJs($assets){
foreach($assets as $key=>$value){
if($key == 'js'){
$this->jsAssets = $value;
}
}
}
}
为了让A)在应用程序中的任何位置而不是在调用标头中createAsset()
调用的 之前创建资产,我必须进行哪些更改。renderAssets()
和 B) 对于您创建的要添加到您定义的类型的资产,在上面的示例中,您看到我正在为 css 创建一个新资产,如何将该资产添加到 css 和 js 中。