调用未定义的方法 Illuminate\Foundation\Application::bindShared()

Posted

技术标签:

【中文标题】调用未定义的方法 Illuminate\\Foundation\\Application::bindShared()【英文标题】:Call to undefined method Illuminate\Foundation\Application::bindShared()调用未定义的方法 Illuminate\Foundation\Application::bindShared() 【发布时间】:2015-09-23 20:34:44 【问题描述】:

我刚刚将 Laravel 从 5.0 升级到 5.1。

我收到此错误:

Call to undefined method Illuminate\Foundation\Application::bindShared()

所以经过一番搜索后,我需要将 bindShared 更改为单例。

我可以在 vendor/illuminate/html/HtmlServiceProvider.php 中做到这一点

问题是,当另一个开发人员在项目上工作并执行 composer 安装,或者我部署到服务器时会发生什么。

如何保存对供应商文件夹中文件的更改?

【问题讨论】:

简短的回答是您不编辑vendor 目录中的任何内容。但是,该答案对您来说并不完全好,因为您目前需要这样做。然而,简单地说,就是错的。您不必在供应商中编辑任何内容来做您想做的事情,因此看起来您可能在您的应用程序代码中做错了什么(某种黑客行为)。确切的问题是什么?我对 L5 不太了解,但也许如果你解释一下你的确切问题是什么(例如,给我们你调用 bindShared 的代码)也许我们可以帮助诊断实际问题。 实际问题是 L 5.1 已经贬低了 bindShared 并且Illumination 仍然使用它。从 L5 升级页面:服务容器的 bindShared 方法已被弃用,取而代之的是单例方法。 我得到它没有Illumination/html,修复它。我执行composer updatecomposer dump-autoload -o 【参考方案1】:

Illuminate/html 已被放弃。请改用Collective/html

要安装它,请使用以下

composer require "laravelcollective/html":"^5.2.0"

然后在 app/app.php 文件中更改/添加如下 对于提供商

Collective\Html\HtmlServiceProvider::class

对于别名

'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,

【讨论】:

【参考方案2】:

这个问题是由bindShared()方法引起的,只需将其更改为singleton()

文件位于:/projectname/vendor/illuminate/html/HtmlServiceProvider.php

更改第 36 和 49 行

【讨论】:

OP 知道这一点并希望避免这种情况。请在发布答案之前阅读问题和 cmets,尤其是迟到的答案。【参考方案3】:

我是 Rails 开发人员,也是 laravel 的新手,这只是我的第一天,就被这个 Form Builder 问题困住了。我经历了许多讨论和帖子,但在 https://laravelcollective.com/docs/5.0/html 上得到了我的解决方案 要使用刀片表单构建器 (Form::open),我们需要更改我们的 composer.json 并在 require 块中添加 "laravelcollective/html": "~5.0"。 然后运行 ​​composer update,因为只有新的依赖项可用于您的项目。 现在添加'Collective\Html\HtmlServiceProvider',在providers 块里面的config/app.php 里面你也需要添加

'aliases' => [
    // ...
      'Form' => 'Collective\Html\FormFacade',
      'Html' => 'Collective\Html\HtmlFacade',
    // ...
  ],

在别名块中的 config/app.php 中。

运行 php artisan serve 享受带有刀片引擎的表单生成器。

【讨论】:

【参考方案4】:

以下 Laravel 功能已被弃用并将被 在 2015 年 12 月发布的 Laravel 5.2 中完全删除:...

服务容器的 bindShared 方法已被弃用,取而代之的是 的单例方法。 ...

参考:https://laravel.com/docs/5.1/upgrade


因此,例如,从 L5.1 开始,您可以安全地进行更改:

    $this->app->bindShared(UserObserver::class, function ()
    
        // ... 
    );

到:

    $this->app->singleton(UserObserver::class, function ()
    
        // ... 
    );

【讨论】:

【参考方案5】:

好的,根据您的评论,我看到了您的问题(当您在问题中提到 HTML 组件时,我应该早点注意到它。

illuminate/html 组件不再是 Laravel 本身的一部分,并且尚未更新以符合 5.1 标准。事实上,我很确定它现在已被 Taylor 正式放弃了。

但是,您可以将 illuminate/html 要求替换为 laravelcollective/html - 这是社区对Illumination/html 的官方接管,应该可以直接替换。

不必在vendor 中乱七八糟!

【讨论】:

感谢您的回答。

以上是关于调用未定义的方法 Illuminate\Foundation\Application::bindShared()的主要内容,如果未能解决你的问题,请参考以下文章

调用未定义的方法 BelongsTo::attach()

未调用自定义 UIButton 的 setIsSelected 方法

调用未定义的方法 Cake\ORM\Entity::query() CakePhp

致命错误:未捕获的错误:调用未定义的方法 stdClass::option();

调用类方法时出现“调用未定义函数”错误

调用未定义的方法 Illuminate\Foundation\Application::bindShared()