【发布时间】:2018-09-21 18:34:25
【问题描述】:
我在询问/回答是因为我在完成这项工作时遇到了很多麻烦,我想展示一个分步实施。
参考资料:
【问题讨论】:
我在询问/回答是因为我在完成这项工作时遇到了很多麻烦,我想展示一个分步实施。
参考资料:
【问题讨论】:
这可能不是唯一在 Laravel 5 中实现外观的方式,但这里是我是如何做到的。
我们将在Foobar 命名空间中创建一个自定义的Foo 外观。
首先,对于这个例子,我将在我的项目中创建一个新文件夹。它会拥有自己的namespace,这样更容易找到。
在我的例子中,该目录被称为 Foobar:
在这里,我们将使用我们的类定义创建一个新的 PHP 文件。就我而言,我称之为Foo.php。
<?php
// %LARAVEL_ROOT%/Foobar/Foo.php
namespace Foobar;
class Foo
{
public function Bar()
{
return 'got it!';
}
}
在我们花哨的新文件夹中,我们可以为我们的外观添加一个新的 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 类。
php artisan 创建一个新的提供者
所以现在我们需要一个新奇的供应商。值得庆幸的是,我们有很棒的 artisan 工具。就我而言,我会称之为FooProvider。
php artisan make:provider FooProvider
Bam!我们有一个供应商。 Read more about service providers here. 现在只知道它有两个功能(boot 和 register),我们将添加一些代码到 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 可能会提示错误完成。config/app.php
现在我们必须告诉 Laravel 我们有兴趣使用我们刚刚创建的这些随机文件,我们可以在 config/app.php 文件中这样做。
将您的提供程序类引用添加到'providers':App\Providers\FooProvider::class
将您的外观类引用添加到'aliases':'Foo' => Foobar\Facades\Foo::class
请记住,在 aliases 中,我写了'Foo',你会想把你想要引用你的门面的名字放在那里。所以如果你想在你的应用周围使用MyBigOlFacade::helloWorld(),你应该以'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class开始那一行
composer.json
您应该需要的最后一个代码更改是更新您的composer.json 的psr-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
【讨论】:
artisan optimize 命令的指针
Foobar\Join; 有什么用?不幸的是,我得到的最终结果是Class 'Foobar\Facades\Foo' not found。按照信中的指示进行操作。
Foobar\Foo。