Mar*_*tin 13

这可能不是在Laravel 5中实现外观的唯一方法,但这是我如何做到的.

我们将FooFoobar命名空间中创建一个自定义外观.

1.创建自定义类

首先,对于这个例子,我将在我的项目中创建一个新文件夹.它将获得自己的命名空间,以便于查找.

在我的例子中,该目录名为Foobar:

在此输入图像描述

在这里,我们将使用我们的类定义创建一个新的PHP文件.在我的情况下,我打电话给它Foo.php.

<?php
// %LARAVEL_ROOT%/Foobar/Foo.php

namespace Foobar;


class Foo
{
    public function Bar()
    {
        return 'got it!';
    }
}
Run Code Online (Sandbox Code Playgroud)

2.创建一个外观类

在我们新奇的文件夹中,我们可以为我们的外观添加一个新的PHP文件.我要打电话给它FooFacade.php,我把它放在一个名为Foobar\Facades的不同命名空间中.请记住,在这种情况下,命名空间不反映文件夹结构!

<?php
// %LARAVEL_ROO%/Foobar/FooFacade.php

namespace Foobar\Facades;


use Illuminate\Support\Facades\Facade;

class Foo extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'foo'; // Keep this in mind
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 请记住您返回的内容,getFacadeAccessor因为您需要在一瞬间.

另请注意,您正在此处扩展现有的Facade类.

3.使用创建新的提供程序 php artisan

所以现在我们需要一个新的提供者.谢天谢地,我们有一个很棒的artisan工具.在我的情况下,我会打电话给它FooProvider.

php artisan make:provider FooProvider
Run Code Online (Sandbox Code Playgroud)

巴姆!我们有一个提供者.阅读更多有关服务提供商的信息 现在只知道它有两个函数(bootregister),我们将添加一些代码register.我们将绑定我们的新提供商我们的应用程序:

$this->app->bind('foo', function () {
    return new Foo; //Add the proper namespace at the top
});
Run Code Online (Sandbox Code Playgroud)

因此,这bind('foo'部分实际上将与您在FooFacade.php代码中添加的内容相匹配.在我return 'foo';之前说过的地方,我想要这个绑定来匹配它.(如果我说过return 'wtv';我会bind('wtv',在这里说.)

此外,我们需要告诉Laravel在哪里找到Foo!

所以在顶部我们添加名称空间

use \Foobar\Foo;
Run Code Online (Sandbox Code Playgroud)

立即查看整个文件:

<?php
// %LARAVEL_ROOT%/app/Providers/FooProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Foobar\Foo;

class FooProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('foo', function () {
            return new Foo;
        });
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 确保您使用Foobar\Foo而不是Foobar\Facades\Foo- 您的IDE可能会建议错误完成.

4.添加我们的引用 config/app.php

现在我们必须告诉Laravel我们有兴趣使用我们刚刚创建的这些随机文件,我们可以在我们的config/app.php文件中执行此操作.

  1. 将您的提供者类引用添加到'providers':App\Providers\FooProvider::class

  2. 将facade类引用添加到'aliases':'Foo' => Foobar\Facades\Foo::class

请记住,在别名中,我写的地方'Foo',你会希望在那里放置你想要引用你的立面的名字.因此,如果你想MyBigOlFacade::helloWorld()在你的应用程序中使用,你就可以开始使用'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class

5.更新你的 composer.json

您需要的最后一个代码更改是更新您composer.jsonpsr-4空间.你必须添加这个:

    "psr-4": {
        "Foobar\\" : "Foobar/",
        // Whatever you had already can stay
    }
Run Code Online (Sandbox Code Playgroud)

最后的举动

好的,既然你已经改变了所有,那么你需要的最后一件事就是刷新作曲家和工匠的缓存.试试这个:

composer dumpautoload
php artisan cache:clear
Run Code Online (Sandbox Code Playgroud)

用法和快速测试:

app/routes.php以下位置创建路线:

Route::get('/foobar', 'FooBarController@testFoo');
Run Code Online (Sandbox Code Playgroud)

然后跑

php artisan make:controller FooBarController
Run Code Online (Sandbox Code Playgroud)

并添加一些代码,所以它现在看起来像这样:

<?php

namespace App\Http\Controllers;

use Foobar\Facades\Foo;

use App\Http\Requests;

class FooBarController extends Controller
{
    public function testFoo()
    {
        dd(Foo::Bar());
    }
}
Run Code Online (Sandbox Code Playgroud)

你应该得到以下字符串:

在此输入图像描述


故障排除

  • 如果你最终得到并且错误地说它无法找到该类Foobar\Facades\Foo,请尝试运行php artisan optimize

  • 另一件事,我省略了缓存清除和Laravel返回给我一个"类未找到错误",所以我运行命令**php artisan optimize**,一切正常 (2认同)