标签: zf3

如何创建ZF3控制台应用程序

在Zend Framework 2中,将初始模块横幅添加到控制台应用程序非常简单.

我们所需要的只是实现getConsoleBannergetConsoleUsage方法并实现Zend\ModuleManager\Feature\ConsoleUsageProviderInterfaceConsoleBannerProviderInterface接口.

这足以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)

php zend-framework console-application zf3

18
推荐指数
1
解决办法
5206
查看次数

如何将Zend Framework 1迁移到3

有没有人请描述Zend从Ver 1到3更改了多少架构.最近zend发布了ZF3,但没有提供如何从zf1迁移到zf3的信息.我有一个应用程序是在zf1中开发的,现在正在寻找将它升级为使用带有ZF3的PHP 7电源.我是否需要重写整个代码或需要多少努力才能转移到最新版本.

此外,ZF3声称它在PHP7下的速度提高了4倍.实际上它是PHP7本身更快,而不是ZF3.与Laravel框架相比,我不确定它们有多少改进,而Laravel框架是过去几年的顶级框架之一.

如果有人使用ZF3请分享他们的经验.

php zend-framework php-7 zend-framework3 zf3

9
推荐指数
2
解决办法
6227
查看次数

ZF3 zend-mvc-skeleton国际化不起作用

我正在尝试评估是否已经是开始转向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>&copy; 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)

zend-framework-mvc zend-framework3 zf3

5
推荐指数
2
解决办法
6546
查看次数

ACL授权失败后的ZF3重定向

我有一个带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)

php zend-framework2 zend-framework3 zf3

5
推荐指数
1
解决办法
1828
查看次数

用于互连服务的ZF3服务DI的有效模式

据我所知,有效模式是:

  • 一个实例化所需服务的FooControllerFactory(FooService)
  • 一个带有构造函数__construct的FooController(FooService $ fooService)
  • Controller获取一些基本数据并从服务中获取结果
  • 服务包含所有必需的业务逻辑这是一个基本服务.最终,此服务将需要其他服务用于各种活动.例如CacheService,SomeOtherDataService.

问题是,包含/注入其他互连服务的有效/适当模式是什么?

我们目前的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 …

php zend-framework-mvc zend-framework2 zend-framework3 zf3

4
推荐指数
1
解决办法
746
查看次数

使用Zend Framework 3构建RESTful服务的最佳方法

我们正在启动一个新项目,该项目将利用RESTful服务与Web客户端(AngularJS)和移动平台(Android和iOS)进行对话。

这个想法是将业务逻辑隐藏在RESTful服务内部,并对Web客户端和移动平台使用相同的代码。

我们的服务器是使用Zend Framework 3(我是框架的新手)在PHP中构建的。该应用程序将包含具有数百个服务的数十个实体。

我在网上注意到ZF2似乎具有REST模块,但我找不到ZF3的模块(至少在文档中找不到)。

我有一些问题:

  • 使用ZF3提供RESTful服务的最佳途径是什么?
  • 我应该安装ZF模块吗?ZF3是否已准备好使用一些东西?
  • 我是否应该仅在代码中为我的服务创建模块?其他模块是否应将此REST模块称为业务逻辑?

php rest zend-framework zend-framework3 zf3

4
推荐指数
1
解决办法
6068
查看次数

实体公共字段的学说继承

我正在为我的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)我应该在哪里放置我的基本实体,以便可以为不同模块上的所有实体继承它?

我很感激有人可以提供一些示例/链接如何做到这一点.

php inheritance doctrine-orm zend-framework3 zf3

2
推荐指数
1
解决办法
2930
查看次数

zf3 onRoute事件监听器

我的模型中有一段代码:

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,则不再调用侦听器.怎么解决?

event-listener zf3

2
推荐指数
1
解决办法
1040
查看次数