【问题标题】:How to Set Up Facades in Laravel 5.2 (outside of /app)如何在 Laravel 5.2 中设置 Facades(在 /app 之外)
【发布时间】:2018-09-21 18:34:25
【问题描述】:

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

参考资料:

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

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

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

    1。创建自定义类

    首先,对于这个例子,我将在我的项目中创建一个新文件夹。它会拥有自己的namespace,这样更容易找到。

    在我的例子中,该目录被称为 Foobar

    在这里,我们将使用我们的类定义创建一个新的 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' =&gt; Foobar\Facades\Foo::class

    请记住,在 aliases 中,我写了'Foo',你会想把你想要引用你的门面的名字放在那里。所以如果你想在你的应用周围使用MyBigOlFacade::helloWorld(),你应该以'MyBigOlFacade' =&gt; MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class开始那一行

    5。更新您的composer.json

    您应该需要的最后一个代码更改是更新您的composer.jsonpsr-4 空格。您必须添加以下内容:

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

    最后一步

    好的,既然您已经完成了所有更改,那么您最不需要的就是刷新 composer 和 artisan 中的缓存。试试这个:

    composer dumpautoload
    php artisan cache:clear
    

    用法和快速测试:

    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());
        }
    }
    

    你应该得到以下字符串:


    疑难解答

    • 如果您最终出现错误提示找不到课程Foobar\Facades\Foo请尝试运行php artisan optimize

    【讨论】:

    • 拜托!如果您使用本指南但有问题 - 请告诉我,以便我修复它!
    • 另外一件事,我省略了缓存清除,Laravel 给我返回了“找不到类错误”,所以我运行了命令 php artisan optimize,一切正常
    • 感谢@IlGala,我做了一些修改,包括关于使用artisan optimize 命令的指针
    • Foobar\Join; 有什么用?不幸的是,我得到的最终结果是Class 'Foobar\Facades\Foo' not found。按照信中的指示进行操作。
    • 在将它们放到 SO 之前,我已经更改了我的类的名称。我想我忘了改变那个类名!我想它应该是Foobar\Foo
    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 2018-05-15
    • 2018-12-31
    相关资源
    最近更新 更多