在Zend Framework 2中,将初始模块横幅添加到控制台应用程序非常简单.
我们所需要的只是实现getConsoleBanner和getConsoleUsage方法并实现Zend\ModuleManager\Feature\ConsoleUsageProviderInterface或ConsoleBannerProviderInterface接口.
这足以public/index.php通过CLI启动时在控制台中转储这些消息.
在Zend Framework 3中,它不一样.
执行相同的设置不会提供相同的结果.实际上在控制台中我们看到骨架应用程序的默认html页面与我们通过浏览器访问它的方式相同.
我们安装自定义模块之前,该网页被看到:这里是相关的文档zend-mvc-console模块
https://zendframework.github.io/zend-mvc-console/intro/
即使按照建议安装模块('Zend\Mvc\Console'在模块定义中添加),也不会显示控制台横幅.我已经在方法中使用var dumping进行了测试,并且我能够查看数据,因此框架执行这些方法但在控制台中没有显示结果.
我已经测试了控制台路由和控制器.找到路径,执行控制器操作但是cli中没有显示任何内容.
我已经挖掘了框架的代码,似乎Zend\Mvc\Console\ResponseSender\ConsoleResponseSender该类永远不会被执行.
我是否必须注册一些view_manager策略才能在CLI中显示某些内容?
以下是zf3骨架应用程序的源代码:https://gist.github.com/kachar/06f0c9096bcc1cc0b00f4612aed1b68b
运行应用程序:
$ php -v
PHP 7.0.6 (cli) (built: Apr 27 2016 14:00:40) ( ZTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
$ php public/index.php
Application\Module::getConsoleBanner
Application\Module::getConsoleUsage
$ php public/index.php user
Application\Controller\IndexController::indexAction
Run Code Online (Sandbox Code Playgroud) 有没有人请描述Zend从Ver 1到3更改了多少架构.最近zend发布了ZF3,但没有提供如何从zf1迁移到zf3的信息.我有一个应用程序是在zf1中开发的,现在正在寻找将它升级为使用带有ZF3的PHP 7电源.我是否需要重写整个代码或需要多少努力才能转移到最新版本.
此外,ZF3声称它在PHP7下的速度提高了4倍.实际上它是PHP7本身更快,而不是ZF3.与Laravel框架相比,我不确定它们有多少改进,而Laravel框架是过去几年的顶级框架之一.
如果有人使用ZF3请分享他们的经验.
我正在尝试评估是否已经是开始转向ZF3的合适时机(或继续使用ZF2开发我的应用程序).因此,我安装了mvc-skeleton应用程序,并浏览了MVC教程(这里),它完美地运行,直到我进入国际化部分.
我安装了组件(即zend-i18n和zend-mvc-i18n组件),创建了翻译文件(即en_US.mo和en_US.po)并将它们复制到我的module/Application/language/文件夹中,并在应用程序配置文件中添加了配置.
// in a module's module.config.php:
'translator' => [
'locale' => 'en_US',
'translation_file_patterns' => [
[
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
],
],
],
Run Code Online (Sandbox Code Playgroud)
当然,在layout.phtml文件中添加要翻译的文本
<p>© 2016 by Examples Ltd. <?= $this->translate('All rights reserved') ?></p>
Run Code Online (Sandbox Code Playgroud)
但是,出于某种原因,它无法正常工作
Zend\ServiceManager\Exception\ServiceNotFoundException
File:
my_install_path/zend-mvc-skeleton-application/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php:133
Message:
A plugin by the name "translate" was not found in the plugin manager Zend\View\HelperPluginManager
Stack trace:
#0 /my-own-install-path/vendor/zendframework/zend-view/src/Renderer/PhpRenderer.php(373): Zend\ServiceManager\AbstractPluginManager->get('translate', NULL)
#1 /my-own-install-path/vendor/zendframework/zend-view/src/Renderer/PhpRenderer.php(391): Zend\View\Renderer\PhpRenderer->plugin('translate')
#2 /my-own-install-path/module/Application/view/application/index/index.phtml(1): Zend\View\Renderer\PhpRenderer->__call('translate', Array)
#3 /my-own-install-path/module/Application/view/application/index/index.phtml(1): …Run Code Online (Sandbox Code Playgroud) 我有一个带ACL的新ZF3应用程序.现在,在未经授权的情况下,我需要重定向到错误页面(例如403).我认为最好的方法是发射一个事件然后抓住它,但我失败了......
所有都在我的用户模块中,在Module.php(摘录)中:
namespace User;
use Zend\Mvc\MvcEvent;
use Zend\Permissions\Acl\Acl;
use Zend\Stdlib\Response ;
use Zend\View\Model\ViewModel;
[...]
class Module implements ConfigProviderInterface
{
[...]
public function onBootstrap(MvcEvent $e)
{
// Set event to check ACL, then to handle unauthorized access
$eventManager = $e->getApplication()->getEventManager();
$eventManager->attach(MvcEvent::EVENT_ROUTE, array($this, 'checkProtectedRoutes'), 1);
$eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'dispatchError'), -999);
// Init ACL
$this->initAcl($e);
}
public function initAcl(MvcEvent $e)
{
[...]
}
public function checkProtectedRoutes(MvcEvent $e)
{
// My access logic working fine. return if OK
[...]
// if authorization failed …Run Code Online (Sandbox Code Playgroud) 据我所知,有效模式是:
问题是,包含/注入其他互连服务的有效/适当模式是什么?
我们目前的reallife示例极其简化:
AuctionController
/**
* get vehicles for specific auction
*/
public function getVehiclesAction ()
{
$auctionService = $this->getAuctionService(); // via service locator
$auctionID = (int) $this->params('auction-id');
$auction = $auctionService->getAuctionVehicle($auctionID);
return $auction->getVehicles();
}
Run Code Online (Sandbox Code Playgroud)
AuctionService
public function getAuctionVehicles($auctionID) {
$auction = $this->getAuction($auctionID);
// verify auction (active, permissions, ...)
if ($auction) {
$vehicleService = $this->getVehicleService(); // via service locator
$vehicleService->getVehicles($params); // $params = some various conditions or array of IDs
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
VehicleService …
我们正在启动一个新项目,该项目将利用RESTful服务与Web客户端(AngularJS)和移动平台(Android和iOS)进行对话。
这个想法是将业务逻辑隐藏在RESTful服务内部,并对Web客户端和移动平台使用相同的代码。
我们的服务器是使用Zend Framework 3(我是框架的新手)在PHP中构建的。该应用程序将包含具有数百个服务的数十个实体。
我在网上注意到ZF2似乎具有REST模块,但我找不到ZF3的模块(至少在文档中找不到)。
我有一些问题:
我正在为我的web项目使用Zend Framework 3和Doctrine ORM.
我在我的应用程序的多个模块(User,Stock,Sales),并在每个模块的一些实体模型:
User模块实体:User,Account,等.Stock模块实体:SKU,StockLevel,等.Sales模块实体:Invoice,PaymentMethod,等.默认情况下,所有实体都有公共字段,例如:
creationDateTime:创建日期/时间creationUser:创建实体的用户lastChangeDateTime:上次实体更改的日期/时间lastChangeUser:上次更改实体的用户我不想放置那些字段或每个实体,而是创建一个扩展我所有实体的项目基类.我需要有适用于所有实体的通用方法,即:
/**
* Update the last change fields
* @param string $user User that is updating
*/
public void updateLastChange($user)
{
$this->lastChageDataTime = \Datetime();
$this->lastChangeUser = $user;
}
Run Code Online (Sandbox Code Playgroud)
正如我从文档中看到的那样,我认为我需要使用单表继承,但我无法弄清楚具体如何.问题:
a)通过使用单表继承,Doctrine会在数据库中为这些字段创建一个基表,还是会为每个实体表加入基表和实体字段,换句话说,我只有实体表,否则这个继承会创建基本字段的数据库表也是?
b)我应该在哪里放置我的基本实体,以便可以为不同模块上的所有实体继承它?
我很感激有人可以提供一些示例/链接如何做到这一点.
我的模型中有一段代码:
public function init(ModuleManager $manager)
{
// Get event manager.
$eventManager = $manager->getEventManager();
$sharedEventManager = $eventManager->getSharedManager();
// Register the event listener method.
$sharedEventManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'myFunc'], 100);
}
// Event listener method.
public function myFunc(MvcEvent $event)
{
echo 'it works!';
exit;
}
Run Code Online (Sandbox Code Playgroud)
侦听器被调用.虽然如果我将事件类型更改为MvcEvent :: EVENT_ROUTE,则不再调用侦听器.怎么解决?