到目前为止,我已经想通了如何返回Zend框架2.首先一个典型的JSON响应,我加入ViewJsonStrategy
到strategies
了部分view_manager
配置.然后,ViewModel
我返回一个JsonModel
设置了所有变量的实例,而不是从控制器操作返回一个实例.
既然我已经想到了这一点,我需要了解如何渲染视图并在JSON响应中返回它.在ZF1中,我能够使用$this->view->render($scriptName)
,它将HTML作为字符串返回.在ZF2中,该Zend\View\View::render(...)
方法返回void
.
那么......我如何渲染HTML视图脚本并在一个请求中以JSON响应返回它?
这就是我现在所拥有的:
if ($this->getRequest()->isXmlHttpRequest()) {
$jsonModel = new JsonModel(...);
/* @todo Render HTML script into `$html` variable, and add to `JsonModel` */
return $jsonModel;
} else {
return new ViewModel(...);
}
Run Code Online (Sandbox Code Playgroud) 我的IDE是Zend Studio 8,它具有JavaScript的相对基本视角(类似于Eclipse PDT中的透视图,如果不相同).在我正在处理的应用程序中,我们在多个文件中扩展了一个基础对象,这有效地扼杀了自动完成功能.请参阅下面的示例场景......
// global.js
var App = {
objectA: {
method1: function() {},
method2: function() {}
},
objectB: {
method1: function() {},
method2: function() {}
}
};
// extend.js
App.Extend = {
anotherMethod: function() {}
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,键入App.
会导致自动完成显示为objectA
和objectB
,但不是Extend
.如果我将扩展添加到global.js中的App变量,它将出现在自动完成中,但不会出现在anotherMethod中.如果我要使用var Extend = { /* code */ };
,自动完成将适用于该Extend
对象,因此问题似乎与代码扩展到多个文件的事实无关.也许是因为单个对象分布在多个文件中......或其他内容.
有人有主意吗?
我目前正在使用Zend Framework与PHPUnit一起对应用程序进行单元测试.当Hudson执行PHPUnit shell命令时,在代码覆盖生成期间的某个时间达到最大PHP内存限制.我目前总共有41个测试,有334个断言.
通过使用-d memory_limit=768M
开关将memory_limit设置提高到768M,我成功地消除了这个错误; 但是,我担心随着复杂性的增加以及测试/断言的总数,我将没有足够的内存来生成用于代码覆盖率统计的HTML.
操作系统: CentOS 5.5
控制面板: WHM/cPanel
CI服务器: Hudson
/usr/local/bin/phpunit
--verbose
-d memory_limit=512M
--log-junit ../../build/logs/phpunit.xml
--coverage-clover ../../build/logs/coverage/clover.xml
--coverage-html ../../build/logs/coverage-html/
Run Code Online (Sandbox Code Playgroud)
致命错误:允许的内存大小为536870912字节
在提交我的更改并让Hudson处理其余的更改之前,我使用Windows 7进行开发.在W7中运行相同的命令时,内存使用率从未超过340MB.
正如你们许多人所知,PHP 5.4 alpha已经发布.我对以下问题有疑问.
简化的字符串偏移读数.
$str[1][0]
现在是一个法律结构.
$str[1][0]
工作究竟如何?
我们最近开始使用Doctrine 2.2和Zend Framework 2的一部分来改进组织,减少重复等.今天,我开始提出实现服务层的想法,作为我们的控制器和Doctrine实体之间的中介.
现在,我们的大部分逻辑都存在于控制器中.另外,我们使用动作助手来测试某些权限; 然而,在实施Zend\Di后我想出了一种新的方法.我开始创建特定于实体的服务模型,它使用Zend\Di注入EntityManager实例,以及当前用户的权限.
控制器代码如下:
class Project_DeleteController extends Webjawns_Controller_Action
{
public function init()
{
$this->_initJsonContext();
}
public function indexAction()
{
$response = $this->_getAjaxResponse();
$auditId = (int) $this->_getParam('audit_id');
if (!$auditId) {
throw new DomainException('Audit ID required');
}
/* @var $auditService Service\Audit */
$auditService = $this->getDependencyInjector()->get('Service\Audit');
try {
$auditService->delete($auditId);
$response->setStatusSuccess();
} catch (Webjawns\Exception\SecurityException $e) {
$this->_noAuth();
} catch (Webjawns\Exception\Exception $e) {
$response->setStatusFailure($e->getMessage());
}
$response->sendResponse();
}
}
Run Code Online (Sandbox Code Playgroud)
以及我们的一个服务层的示例.构造函数有两个参数 - 一个是EntityManager,另一个是Entity\UserAccess对象 - 由Zend\Di注入.
namespace Service;
use Webjawns\Service\Doctrine,
Webjawns\Exception;
class Audit extends AbstractService …
Run Code Online (Sandbox Code Playgroud) php model-view-controller service-layer doctrine-orm zend-framework2
尝试运行构建脚本时出现以下错误.
/var/lib/jenkins/jobs/IPS (trunk)/workspace/build.xml:62: Execute failed: java.io.IOException:
Cannot run program "phploc": java.io.IOException: error=2, No such file or directory
Run Code Online (Sandbox Code Playgroud)
我尝试切换到jenkins
用户,并能够顺利运行脚本.我也检查了$PATH
并尝试重新安装.没运气!
鉴于:
if ($variable = get_variable('variable')) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
*$ variable = get_variable('variable')*在Zend Studio中抛出'条件分配'警告.我理解这个警告意味着什么,但有谁知道它背后的理由是什么?它只是编码惯例,可读性等问题吗?
我们将PHP 5.3和Zend Framework用于大型项目,并且遇到了方便的问题.我们在应用程序的不同部分一遍又一遍地重复使用相同的错误消息,例如"您无权完成此操作".有没有人有任何重复使用错误消息的独特方法,所以我们不必一遍又一遍地重写它们?
我的第一个想法是做一些像这样简单的事情:
class ErrorMessage
{
const ERROR_NO_PERMS = 'noPerms';
const ERROR_INT = 'int';
protected static $_messages = array(
self::ERROR_NO_PERMS => 'You do not have permission to complete this action',
self::ERROR_INT => "'%s' must be an integer",
);
public static get($errorCode)
{
if (!array_key_exists($errorCode, self::$_messages)) {
// error
}
// check for translation
return self::$_messages[$errorCode];
}
}
Run Code Online (Sandbox Code Playgroud)
你会怎么做?(请记住,我们希望将其与ZF集成,因此我们对扩展到本机ZF类的任何想法持开放态度.)
以下代码最近开始返回空字符串.它适用于其他系统,因此它似乎不是代码本身的问题.我真的消除了所有的服务器端代码,它仍然做了同样的事情.我也试过使用file_get_contents无济于事,只是在黑暗中拍摄.
$fileStream = fopen('php://input', 'rb');
$fileData = '';
while ($buffer = fread($fileStream, 4096)) {
$fileData .= $buffer;
}
Run Code Online (Sandbox Code Playgroud)
服务器: Zend Server 5.1.0(Apache 2.2.3)
语言: PHP 5.3.5
前端: Plupload(JavaScript插件)
php ×9
jenkins ×2
zend-studio ×2
apache ×1
arrayaccess ×1
centos ×1
doctrine-orm ×1
eclipse ×1
eclipse-pdt ×1
hudson ×1
javascript ×1
json ×1
php-5.3 ×1
phpunit ×1
warnings ×1