php - 在 Laravel 5.2 的 Controller 中使用服务提供者

标签 php laravel-5 controller service-provider

至于标题,我在谷歌上搜索了大约两个小时以寻找有效的答案,并反复阅读了官方文档,但考虑到我对这个框架还比较陌生,所以没有采取任何进一步的措施。在寻找在 Controller 之间共享一些代码的正确方法时出现了疑问,我偶然发现了服务提供商,所以:

  1. 我创建了一个 MyCustomServiceProvider

  2. 我已将它添加到 app.php 文件中的 providersaliases 数组;

  3. 最后,我创建了一个自定义助手类并将其注册为:

    class MyCustomServiceProvider extends ServiceProvider
    {
        public function boot()
        {
            //
        }
    
        public function register()
        {
            $this->app->bind('App\Helpers\Commander', function(){
    
                return new Commander();
    
            });
        }
    }
    

然而,到目前为止,如果我在 Controller 中使用该自定义类,我必须通过 use 语句将路径添加到它:

use App\Helpers\Commander;

否则我会得到一个很好的类未找到异常,显然我的 Controller 没有他的工作。
我怀疑服务提供商有什么东西让我逃避了! :-)

最佳答案

So far, however, if I use that custom class within a controller I necessarily need to add the path to it through the use statement:

`use App\Helpers\Commander;`

otherwise I get a nice class not found exception and obviously my controller does not his job.

是的,这就是它的工作原理。如果不想使用全名,可以使用 Facade相反。

像这样创建 Facade 类:

class Commander extends Facade
{
    protected static function getFacadeAccessor() { return 'commander'; }
}

注册服务:

$this->app->singleton('commander', function ($app) {
    return new Commander();
});

将别名添加到您的config/app.php:

'aliases' => [
    //...
    'Commander' => Path\To\Facades\Commander::class,
    //...
],

并将其用作Facade:

\Commander::doStuff();

为什么你的代码仍然有效,即使你删除了绑定(bind):

当你对函数的参数进行类型提示时,Laravel 不知道你想要的类型(通过绑定(bind)),如果可能的话,Laravel 将尽最大努力为你创建该类。所以即使你没有绑定(bind)这个类,Laravel 也会很乐意为你创建那个类的实例。当您使用接口(interface) 时,您真正需要绑定(bind)的地方。通常,您不会对特定类进行类型提示,而是对接口(interface)进行类型提示。但是 Laravel 不能创建接口(interface)的实例并将其传递给您,因此 Laravel 需要知道它如何构造一个实现您需要的接口(interface)的类。在这种情况下,您会将类(或创建类的闭包)绑定(bind)到接口(interface)。

关于php - 在 Laravel 5.2 的 Controller 中使用服务提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057630/

相关文章:

javascript - mysql查询进度条与php和bootstrap

mysql - 查询 JOINs 2 个模型 ON

php - 找不到类 '..\Unit\UnitTestCase'

ios - EXC_BAD_ACCESS 试图在 UIView Controller 中加载 UITableView

Laravel:在 Controller 外部使用重定向?

python - 使用 python 的桌面 GUI 中的 MVC 模式

PHP/SQL - 三个随机图像

php - 单个主键的 2 个外键引用

javascript - 为什么我的 jquery/ajax 帖子没有在我的 php 代码中注册?

php - 多个程序员如何使用 Laravel 和 GitHub?