1

我有一个我正在学习的课程,它允许您创建一个资产数组,如下所示:

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 的问题是:

  1. 它创建资产,bla3作为 js 和 css 资产,而实际上您是在告诉它创建一个新的 css 资产。
  2. 您只能在上面执行此操作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 中。

4

1 回答 1

2

在你的processJs()方法中,改变这个:

foreach($this->cssAssets as $assetName){

对此:

foreach($this->jsAssets as $assetName){
于 2013-09-26T16:30:50.307 回答