【问题标题】:Laravel 4 IoC Container - Setting Up & Using ProvidersLaravel 4 IoC 容器 - 设置和使用提供者
【发布时间】:2013-03-11 20:21:41
【问题描述】:

我正在尝试在 Laravel 4 (L4) 中使用 http://geotools-php.org/

我按照说明通过 Composer 下载(并验证了供应商文件夹中的 geotools 存在)。

我将“app/providers/GeoTools.php”添加到我的自动加载类映射中。

以下是内容:

{
    "require": {
        "laravel/framework": "4.0.*",
        "toin0u/geotools": "@stable"
    },
    "autoload": {
        "classmap": [
            "app/commands",
            ... more laravel stuff
            "app/providers/GeoTools.php"
        ]
    }
    ... more laravel stuff

我创建了 /providers/GeoTools.php 文件。

以下是内容:

<?php

use Illuminate\Support\ServiceProvider;

class GeoToolsServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('Coordinate', function()
        {

            return new Geotools\Coordinate;

        });
    }

}

在我的 app.php 提供程序数组中,我添加了“GeoToolsServiceProvider”。

这是我的问题:

  1. 显然我做错了什么,应该怎么做
  2. 一旦上述代码正确,如何在整个应用程序中正确使用它?

【问题讨论】:

    标签: php inversion-of-control ioc-container laravel composer-php


    【解决方案1】:

    我是这个库的维护者。

    不可能(目前 Laravel Bêta 5)像您想要的那样绑定 Geotools\Coordinate\Coordinate 类,因为 Laravel IoC 容器不接受没有默认值或类型(即接口/类)的参数,它们是 @987654321 @通过反射。 container 将引发 BindingResolutionException 异常。

    最好的方法是扩展Geotools 类并添加一个方法来创建Coordinate 实例。

    我正在等待 Laravel 4 的稳定版本,以便在 Geotools 中进行任何 BC 中断。

    我刚刚为 Laravel 4 制作了 Geotools package。希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      服务提供商看起来还不错。问题可能在于自动加载,并且没有看到您如何添加到类映射中,很难判断发生了什么。至于用法尝试以下,

      class Foo {
      
         protected $coordinate;
      
         public function __construct(Coordinate $coordinate)
         {
             $this->coordinate = $coordinate
         }
      }
      

      【讨论】:

      • 这个答案让我很困惑。这不像我以前见过的任何例子。我更新了问题以显示类映射文件,并且提供程序中的实现一直存在。我在使用此代码时遇到问题。
      【解决方案3】:

      您应该能够使用应用外观访问实例

      App::make('Coordinate')->$someGeotoolCoordinateFunction();
      

      【讨论】:

      • 好的,我现在知道怎么用了,谢谢。现在,它告诉我在我的 app.php 的那一行中找不到该类(这实际上对我来说是鼓舞人心的)。我还必须缺少一件事。我用更多数据更新了这个问题。
      • 您的设置似乎是正确的。检查 geotools 命名空间是否正确(从包源中,我可以判断它可能是 Geotools\Coordinate\Coordinate)并运行“composer dumpautoload”以获得良好的测量结果。在providers下的composer.json文件中,使用'app/providers'可能更有效。
      猜你喜欢
      • 2023-03-17
      • 2015-05-12
      • 2017-01-11
      • 2019-05-29
      • 2013-12-24
      • 1970-01-01
      • 2014-04-20
      • 2018-08-28
      • 2019-05-12
      相关资源
      最近更新 更多