我正在问/回答是因为我在完成这项工作时遇到了很多麻烦,而且我想展示一个一步一步的实施。
参考文献:
答案 0 :(得分:13)
这可能不是唯一的方式在Laravel 5中实现外观,但这里我是如何做到的。
我们将在Foo
命名空间中创建自定义Foobar
外观。
首先,对于这个例子,我将在我的项目中创建一个新文件夹。它将获得自己的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
请记住,在我写'Foo'
的别名中,您需要在此处输入您想要引用外观的名称。因此,如果您想在应用周围使用MyBigOlFacade::helloWorld()
,那么您可以使用'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class
composer.json
您需要的最后一次代码更改是更新composer.json
的{{3}}个空格。你必须添加这个:
"psr-4": {
"Foobar\\" : "Foobar/",
// Whatever you had already can stay
}
好的,既然你已经改变了所有,那么你需要的最后一件事是刷新作曲家和工匠的缓存。试试这个:
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