(3)模块--ZF2官方教程译文

模块

Zend Framework 2使用了一个模块系统,因此你可在每个独立模块中组织你主要的应用程序细节代码。上节提到的基本应用提供的模块可以为整个应用程序提供引导启动、错误处理、路由配置。它通常被用来提供应用级的控制器,比如说,应用程序的首页,但我们不打算使用上节教程中看到的默认主页,因为我们想使唱片列表页成为主页,该内容存在于我们的模块中。

我们将放置所有的代码到Album模块中,该模块包含我们的控制器,模型,表单,视图以及配置文件。必要时我们也需要微调我们的应用。

从我们所需要的目录开始。

设置Album模块

在我们服务器根目录的module目录下创建一个名为Album的模块,其包含如下所示的子目录:

zf2-tutorial/
    /module
        /Album
            /config
            /src
                /Album
                    /Controller
                    /Form
                    /Model
            /view
                /album
                    /album

你可以看到Album模块使得不同类型的文件得到分离。包含Album命名空间类的PHP文件保存在src/Album目录下,这样当我们需要时可以拥有多个命名空间。view目录同样也有一个叫作album的子目录以保存我们模块的视图脚本文件。

为了加载和配置一个模块,ZF2使用ModuleManager的类来实现该功能。它将在模块根目录(module/Album)下找寻一个叫作Module.php的文件,并期望在该文件中找到一个叫作Album\Module的类。也就是说,在给定的模块下,类文件将自动使用模块目录名作为作为类的名称空间。

在Album模块中创建Module.php文件:在zf2-tutorial/module/Album目录下创建一个叫作Module.php的文件:

<?php
namespace Album;

class Module
{
    public function getAutoloaderConfig()
    {
        return array(
            'Zend\Loader\ClassMapAutoloader' => array(
                __DIR__ . '/autoload_classmap.php',
            ),
            'Zend\Loader\StandardAutoloader' => array(
                'namespaces' => array(
                    __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
                ),
            ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }
}

ModuleManager将自动为我们调用getAutoLoaderConfig()和getConfig()。

Autoloading files 自动加载文件

我们的getAutoloaderConfig()方法返回了一个兼容ZF2的AutoloaderFactory的数组。这样配置,我们可以添加一个类映射到ClassmapAutoloader中,并且添加了模块的名称空间到StanderdAutoloader中。这个基本的自动加载器需要一个名称空间和一个告知如何找寻名称空间下文件的路径。这是PSR-0标准,因此每个类都可以直接映射到相应的文件。参考PSR-0 rules

开发阶段,我们不需要通过classmap来加载文件,所以我们为classmap autoloader提供一个空数组即可。

在zf2-tutorial/module/Album目录下创建一个叫作autoload_classmap.php的文件:

<?php       return array();

由于这是一个空数组,当自动加载器找寻一个使用Album名称空间的类时,将为我们回滚到StandarAutoLoader。

注意:如果你想使用Composer,你需要创建一个空方法,如getAutoLoaderConfig(){ }并添加如下代码到composer.json中:

"autoload": {
    "psr-0": { "Album": "module/Album/src/" }
},

如果你这样做,你需要运行php composer.phar以升级composer自动加载文件。

配置

一旦注册了自动加载器,让我们简单地看一下Album\Module中getConfig()方法的作用。该方法仅简单地加载config/module.config.php配置文件。

在zf2-tutorial/module/Album/config目录下创建一个叫作module.config.php的文件:

<?php
return array(
    'controllers' => array(
        'invokables' => array(
            'Album\Controller\Album' => 'Album\Controller\AlbumController',
        ),
    ),
    'view_manager' => array(
        'template_path_stack' => array(
            'album' => __DIR__ . '/../view',
        ),
    ),
);

该配置信息将通过ServiceManager传递到相应的组件中。我们需要两个初始配置段:controllers和view_manager。控制器配置段提供了模块提供的控制器列表。我们将需要一个叫作AlbumController的控制器,对应到Album\Controller\Album。控制器键值在所有模块中必须是唯一的,因此我们为模块设置了前缀。

使用view_manager配置段,我们就可以为TemplatePathStack配置添加视图目录位置。该配置可允许模板解析类找寻到存放在Album模块中的view/目录下的视图脚本文件。

通告我们的新模块给应用程序

我们现在需要告知ModuleManager我们的新模块已存在。这个任务交由应用程序的config目录下的application.config.php文件来完成。更新该文件,以使模块配置段包含Album模块,代码如下:

<?php
return array(
    'modules' => array(
        'Application',
        'Album',                  // <-- Add this line
    ),
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            'config/autoload/{,*.}{global,local}.php',
        ),
        'module_paths' => array(
            './module',
            './vendor',
        ),
    ),
);

这样,我们就在Application模块后面添加了Album模块到我们的模块列表中。

现在我们就可以在模块下放置我们自定义的代码啦!

转载于:https://my.oschina.net/yoyoko/blog/129852

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于blast序列比对,我并不是很清楚如何使用MATLAB来实现,因为这个领域并不是我的专业。但是,关于MATLAB中V-Blast的ZF和MMSE检测算法仿真代码,我可以给你一些参考。以下是一个简单的MATLAB代码示例,用于实现V-Blast的ZF和MMSE检测算法的仿真: ```matlab % 定义仿真参数 Nt = 4; % 发射天线数 Nr = 4; % 接收天线数 M = 16; % 星座数 SNR_dB = 0:2:20; % 信噪比范围 % 生成随机的发送符号序列 tx_symbols = randi([0 M-1],Nt,1000); % 将发送符号序列转化为星座点 constellation = qammod(0:M-1,M); % 定义信道矩阵 H = (randn(Nr,Nt) + 1i*randn(Nr,Nt))/sqrt(2); % 初始化误码率结果 BER_ZF = zeros(length(SNR_dB),1); BER_MMSE = zeros(length(SNR_dB),1); % 开始仿真 for i=1:length(SNR_dB) % 计算当前信噪比下的噪声方差 SNR = 10^(SNR_dB(i)/10); noise_var = 1/SNR; for j=1:size(tx_symbols,2) % 发送符号序列 tx = tx_symbols(:,j); % 接收信号 rx = H*tx + sqrt(noise_var)*(randn(Nr,1) + 1i*randn(Nr,1)); % ZF检测 tx_hat_ZF = H\rx; [~,idx_ZF] = min(abs(bsxfun(@minus,tx_hat_ZF,constellation)),[],2); rx_hat_ZF = constellation(idx_ZF); BER_ZF(i) = BER_ZF(i) + sum(tx ~= rx_hat_ZF); % MMSE检测 tx_hat_MMSE = (H'*H + noise_var*eye(Nt))\H'*rx; [~,idx_MMSE] = min(abs(bsxfun(@minus,tx_hat_MMSE,constellation)),[],2); rx_hat_MMSE = constellation(idx_MMSE); BER_MMSE(i) = BER_MMSE(i) + sum(tx ~= rx_hat_MMSE); end % 计算误码率 BER_ZF(i) = BER_ZF(i)/(Nt*size(tx_symbols,2)); BER_MMSE(i) = BER_MMSE(i)/(Nt*size(tx_symbols,2)); end % 绘制误码率曲线 semilogy(SNR_dB,BER_ZF,'o-',SNR_dB,BER_MMSE,'o-'); grid on; xlabel('SNR (dB)'); ylabel('BER'); legend('ZF','MMSE'); ``` 以上代码展示了如何使用MATLAB来实现V-Blast的ZF和MMSE检测算法的仿真。其中,首先定义了仿真参数,包括发射天线数、接收天线数、星座数和信噪比范围等;然后生成了随机的发送符号序列,将发送符号序列转化为星座点,定义信道矩阵;接着,初始化误码率结果,并开始仿真。在每个信噪比下,对于每个发送符号序列,进行ZF和MMSE检测,并计算误码率;最后,绘制误码率曲线。 需要注意的是,以上代码只是一个简单的示例,实际应用中可能会有更多的参数和复杂的算法。此外,代码中的信道矩阵是随机生成的,实际应用中需要根据具体情况来确定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值