【问题标题】:How to fix installation/upgrade for newer zendframework?如何修复更新的zendframework的安装/升级?
【发布时间】:2018-06-29 05:23:03
【问题描述】:

从 composer Install,我得到了比旧 Zend/Libeary 更新的版本,但得到了这个错误: atal 错误:未捕获 Zend\ServiceManager\Exception\ServiceNotFoundException:无法将服务“路由器”解析为工厂;你确定你在配置过程中提供了它吗?在 /home/azureuser/nginad/upload/vendor/zendframework/zend-servicemanager/src/ServiceManager.php:687 堆栈跟踪:#0 /home/azureuser/nginad/upload/vendor/zendframework/zend-servicemanager/src/ServiceManager .php(763): Zend\ServiceManager\ServiceManager->getFactory('Router') #1 /home/azureuser/nginad/upload/vendor/zendframework/zend-servicemanager/src/ServiceManager.php(200): Zend\ServiceManager \ServiceManager->doCreate('Router') #2 /home/azureuser/nginad/upload/vendor/zendframework/zend-mvc/src/Application.php(158): Zend\ServiceManager\ServiceManager->get('Router' ) #3 /home/azureuser/nginad/upload/vendor/zendframework/zend-mvc/src/Application.php(273): Zend\Mvc\Application->bootstrap(Array) #4 /home/azureuser/nginad/upload /public/index.php(28): Zend\Mvc\Application::init(Array) #5 {main} 抛出 /home/azureuser/nginad/upload/vendor/zendframework/zend-servicemanager/src/ServiceManager.php在第 687 行

Install Screen...

这是安装在 public 下的文件夹

   Vendor
      Zendframework
          Zend-Mvc
              src
    ...

如何将路由器添加到配置中? 这是我安装的:

【问题讨论】:

  • 我认为您正在尝试通过use 语句提供其他类,并以Application 为例?阅读autoloading classes with composer。然后在public/index.php 文件中找到require '/../vendor/autoload.php 行;-) gl & hf
  • 您链接的 composer.json 文件属于 Zend Framework 2 项目,该项目在 2 年内未更新。你确定这是正确的项目吗?从Zend Skeleton Application 开始。查看public/index.php 文件和composer.json 文件(请参阅该文件中的PSR-4 条目)。接下来,有一个read through this 的 PHP 命名空间。这应该让你开始“让它发挥作用”。如果您仍然需要帮助,我会提出一个新问题。
  • 另外,使用 Zend Skeleton 应用程序:tutorials here。他们没有一切,但他们包含很多信息来帮助你快速启动和运行'ish ;-)
  • 好的,为您创建了一个答案,解释了使用 Composer 设置项目。真的只是基础知识,但请阅读,获取文档并尝试一下。有关 PHP 中“命名空间”的用法、方式和内容,请创建另一个问题,但请阅读我发送给您的链接。可能需要大量阅读和学习,但这是值得的。在当今的 PHP 世界中需要了解它。

标签: php zend-framework2 zend-framework3


【解决方案1】:

我无法清楚地理解您的查询,但如果您正在努力添加路线,那么您可以在module.config.php 中添加您的路线,如下所示

<?php
use Zend\Router\Http\Literal;
use Zend\Router\Http\Segment;

return [
    'router' => [
        'routes' => [
            'home' => [
                'type' => Literal::class,
                'options' => [
                    'route'    => '/',
                    'defaults' => [
                        'controller' => Controller\IndexController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
            'application' => [
                'type'    => Segment::class,
                'options' => [
                    'route'    => '/application[/:action]',
                    'defaults' => [
                        'controller'    => Controller\IndexController::class,
                        'action'        => 'index',
                    ],
                ],
            ],
        ],
    ],

  //...
];

【讨论】:

  • 是的,但是如何使用/访问 public 文件夹中 index.php 中的 Zend\Router/http/xxx 呢?我需要设置zendframework3的路径
  • 需要添加较新的模块,哪些配置以及如何添加? @约瑟夫斯大林
【解决方案2】:

Zend Skeleton Application 在其根项目文件夹中包含this composer.json。您在那里看到它需要某些模块,包括一个用于安装的模块。您还会看到autoload。现在,每个要加载/需要的模块都可以做同样的事情,创建一个额外的 composer.json 文件和需求的结构。在链接文件中,您会看到 zendframework/zend-mvc 是必需的 ("zendframework/zend-mvc": "^3.0.1",)

然后查看zendframework/zend-form 的composer.json 文件。您会看到添加了require 密钥和版本以及一个额外的autoload 密钥。所有这些(甚至更多)都被混合在一起以创建一个可安装的包。该软件包是您的完整安装,安装后,您的项目中的 vendor/ 映射中的所有内容(在项目的根 composer.json 文件旁边)。

下面我对当前项目的 composer.json 进行了稍微修改(删除了一些与问题无关的内容并突出显示了其他内容)屏幕截图。

您可以在左侧看到文件夹结构。在底部,您会看到文件 composer.jsoncomposer.lock

.json(中间屏幕)包含项目的根需求。由于每个包可能有自己的要求,composer.lock 是在安装过程中生成的(右侧的文件)。该文件包含每个已安装的版本。 (使用composer install 命令创建)。

正如您在.lock 文件中看到的,某处需要包51systems/doctrine-encrypt。你也可以在那里读到,那个包有它自己的要求和要加载的命名空间。

现在,Composer 安装过程还会创建您的自动加载。

Zend Framework 在应用程序本身中开始自动加载,但它使用来自vendor/autoload.php 文件的包含文件。下面是来自public/index.php 的一些内容,与自动加载相关。对于完整的东西,安装框架或查看 Github。

// Composer autoloading
include __DIR__ . '/../vendor/autoload.php';

// ... other stuff

// Run the application!
Application::init($appConfig)->run();

好的,这表明我们包括vendor/autoload.php。让我们看看:

<?php

// autoload.php @generated by Composer

require_once __DIR__ . '/composer/autoload_real.php';

return ComposerAutoloaderInit7befb6b36ba61da7e01a592b255158ab::getLoader();

嗯...是的,这就是整个文件。不是很多。但是,我们也可以遵循这一点。

vendor 文件夹中,您会找到一个名为composer 的文件夹。这里有几个以autoload_ 开头的文件,它们确保通过composer.json 文件注册的每个文件(配置PSR-0PSR-4autoload)都被加载。

所以,包括vendor/autoload.php 真的就足够了。单击它们并查看。

接下来,您使用命名空间来使用其他类。你问过这个问题,但是看到这个问题的范围,你应该把它作为一个单独的问题。另外,请通过我在 cmets 中发送给您的链接阅读命名空间。


下面的讨论已经失控,因此请按步骤执行以下操作:

  1. 确保你有一个主机设置(打开:Ubuntu (Apache)Windows 10 (Apache)Mac (Apache)Ubuntu (nginx)Windows 10 (nginx)Mac (nginx))(暂时让它是一个空文件夹,称之为“骨架”,主机名“skeleton.loc”)
  2. 下载Zend Skeleton Application (direct .zip link)
  3. 从第 1 步解压到新文件夹中(“骨架”)
  4. 在终端会话中打开主机文件夹“skeleton”
  5. 运行composer install(来自“skeleton”终端会话)(您想在安装期间为所有选项“注入module.config.php”(这次不挑剔),即option 1(每次))
  6. 等待安装运行
  7. 在您的浏览器中访问“skeleton.loc”(可能是规范的:http://skeleton.loc/),您应该会看到下面的图片(但对于 ZF3 ;),它是从互联网上撕下来的)

【讨论】:

  • 好吧,说真的,你想做什么? 1 - Download the .zip file > 2 - 提取到您托管项目的地方 > 3 - 在文件夹中运行 Composer install > 4 - 在浏览器中转到项目 URL。完毕。您的项目已设置完毕。
  • 想添加一个模块?在文件夹Application(在module/)旁边,创建一个NewModule 文件夹。在其中添加文件夹src,在其中创建Module.php 文件。确保该文件 (module/NewModule/src/Module.php) 中的命名空间是 NewModule。从Application 模块中的同名类复制配置函数。创建module/NewModule/config/module.config.php 文件,让它返回空数组(内容:&lt;?php return [];)。转到 Composer(下一条评论继续)
  • 转到项目根目录中的composer.json 文件。在autoload &gt; PSR-4 条目下添加"NewModule\\" : "module/NewModule/src/",就像我回答中的图片一样。然后在终端运行composer dump-autoload(这会根据更新的配置重新生成自动加载文件)。您的新模块现在应该可以正常工作了(还没有做任何事情,但它就在那里)。
  • 我的网站上有一个关于如何设置 Zend Framework 2 项目的过时教程。同样的步骤仍然适用于 Zend Framework 3。还包括更多解释。我被告知在某个地方仍然存在一些错误,但您可以在此过程中找出这些错误。 Tutorial link.
  • 我刚刚看到了对您问题的修改,包括屏幕截图。您从哪个版本的 Zend Framework 开始?这看起来像 ZF 1(一),对吗?您是在升级现有应用程序还是开始清理?如果是后者,请完全删除所有内容并从我提供的答案重新开始(从 Zend Skeleton Application 开始,因为这是一个可靠的起点!)。 Sincs ZF2(因此是 3),实际上根本不需要更改 index.php 文件中的任何内容......永远。
猜你喜欢
  • 2014-01-12
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 2020-12-16
  • 2022-08-17
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
相关资源
最近更新 更多