我在問/回答,因爲我已經很難解決這個問題,並且我想展示一個步驟的實現。如何在Laravel 5.2中設置外觀(在/ app之外)
參考文獻:
- https://laravel.com/docs/5.0/facades#creating-facades
- http://www.n0impossible.com/article/how-to-create-facade-on-laravel-51
我在問/回答,因爲我已經很難解決這個問題,並且我想展示一個步驟的實現。如何在Laravel 5.2中設置外觀(在/ app之外)
參考文獻:
這可能不是實現在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
}
}
另外請注意,您在這裏擴展現有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
的psr-4
空間。你將不得不補充一點:
"psr-4": {
"Foobar\\" : "Foobar/",
// Whatever you had already can stay
}
好了,現在你有一切都改變了,你需要的最後一件事就是刷新兩個作曲家和工匠的高速緩存。試試這個:
composer dumpautoload
php artisan cache:clear
在app/routes.php
創建路線:
Route::get('/foobar', '[email protected]');
然後運行
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
**請!**如果您使用本指南並且有些東西不起作用 - 請告訴我,以便我可以修復它! – Martin
最後一個命令是緩存:清除不緩存:乾淨 – IlGala
另一件事,我省略了緩存清除和Laravel返回給我一個「類未找到錯誤」,所以我運行命令** php artisan optimize **並且一切正常 – IlGala