2016-02-25 38 views

回答

13

這可能不是實現在Laravel 5外牆的唯一方式,但這裏是我是如何做的

我們將在Foobar名稱空間中創建自定義Foo外觀。

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 
    } 
} 
  • 請記住,你在​​返回的內容,你將需要在某一時刻。

另外請注意,您在這裏擴展現有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

請記住,在別名,我在那兒寫過'Foo',你會想把你想要引用你的門面的名字放在那裏。所以,如果你想使用MyBigOlFacade::helloWorld()在你的應用程序,你會開始該行以'MyBigOlFacade' => MyApp\WhereEverMyFacadesAre\MyBigOlFacade::class

5.更新您的composer.json

如果你需要的最後一個代碼改變是更新您的composer.jsonpsr-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()); 
    } 
} 

您應該結束了與以下字符串:

enter image description here


故障排除

  • 如果你最終和錯誤說,它不能找到類Foobar\Facades\Foo嘗試運行php artisan optimize
+0

**請!**如果您使用本指南並且有些東西不起作用 - 請告訴我,以便我可以修復它! – Martin

+1

最後一個命令是緩存:清除不緩存:乾淨 – IlGala

+2

另一件事,我省略了緩存清除和Laravel返回給我一個「類未找到錯誤」,所以我運行命令** php artisan optimize **並且一切正常 – IlGala