如何在Laravel 5.2中设置外墙(在/ app之外)

时间:2016-02-25 22:32:18

标签: php laravel laravel-5

我正在问/回答是因为我在完成这项工作时遇到了很多麻烦,而且我想展示一个一步一步的实施。

参考文献:

1 个答案:

答案 0 :(得分:13)

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

我们将在Foo命名空间中创建自定义Foobar外观。

1。创建自定义类

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

在我的情况下,该目录名为 Foobar

enter image description here

在这里,我们将使用我们的类定义创建一个新的PHP文件。就我而言,我称之为Foo.php

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

namespace Foobar;


class Foo
{
    public function Bar()
    {
        return 'got it!';
    }
}

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
    }
}
  • 请记住您在getFacadeAccessor中返回的内容,因为您将需要这样做。

另请注意,您正在此处扩展现有的Facade课程。

3。使用php artisan

创建新的提供商

所以现在我们需要一个新的提供者。值得庆幸的是,我们拥有了令人敬畏的artisan工具。在我的情况下,我会称之为FooProvider

php artisan make:provider FooProvider

Bam!我们有一个提供商。 Read more about service providers here.目前只知道它有两个函数(bootregister),我们将向register添加一些代码。我们将bind我们的新应用提供给我们的应用:

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

因此,此 bind('foo' 部分实际上与您在FooFacade.php代码中的内容相匹配。之前我说过return 'foo';,我希望这个绑定与之匹配。 (如果我说return 'wtv';我会在这里说bind('wtv',。)

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

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

use \Foobar\Foo;

立即查看整个文件:

<?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;
        });
    }
}
  • 请确保使用 Foobar\Foo 而非Foobar\Facades\Foo - 您的IDE可能会建议错误完成。

4。添加我们对config/app.php

的引用

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

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

  2. 将您的外观类引用添加到'aliases''Foo' => Foobar\Facades\Foo::class

  3. 请记住,在我写'Foo'别名中,您需要在此处输入您想要引用外观的名称。因此,如果您想在应用周围使用MyBigOlFacade::helloWorld(),那么您可以使用'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class

    开始该行

    5。更新您的composer.json

    您需要的最后一次代码更改是更新composer.json的{​​{3}}个空格。你必须添加这个:

        "psr-4": {
            "Foobar\\" : "Foobar/",
            // Whatever you had already can stay
        }
    

    最后一步

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

    composer dumpautoload
    php artisan cache:clear
    

    用法&amp;快速测试:

    app/routes.php中创建路线:

    Route::get('/foobar', 'FooBarController@testFoo');
    

    然后运行

    php artisan make:controller FooBarController
    

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

    <?php
    
    namespace App\Http\Controllers;
    
    use Foobar\Facades\Foo;
    
    use App\Http\Requests;
    
    class FooBarController extends Controller
    {
        public function testFoo()
        {
            dd(Foo::Bar());
        }
    }
    

    您最终应该使用以下字符串:

    psr-4

    故障排除

    • 如果您最终收到错误且说错误找不到课程Foobar\Facades\Foo请尝试运行php artisan optimize