调用未定义的方法 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 update
和composer 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()的主要内容,如果未能解决你的问题,请参考以下文章
未调用自定义 UIButton 的 setIsSelected 方法
调用未定义的方法 Cake\ORM\Entity::query() CakePhp