Mar*_*tin 6 php laravel laravel-5
我问/应答,因为我有这么多的麻烦这方面的工作,我想表现出一步一步的实现.
参考文献:
Mar*_*tin 13
这可能不是在Laravel 5中实现外观的唯一方法,但这是我如何做到的.
我们将Foo在Foobar命名空间中创建一个自定义外观.
首先,对于这个例子,我将在我的项目中创建一个新文件夹.它将获得自己的命名空间,以便于查找.
在我的例子中,该目录名为Foobar:
在这里,我们将使用我们的类定义创建一个新的PHP文件.在我的情况下,我打电话给它Foo.php.
<?php
// %LARAVEL_ROOT%/Foobar/Foo.php
namespace Foobar;
class Foo
{
public function Bar()
{
return 'got it!';
}
}
Run Code Online (Sandbox Code Playgroud)
在我们新奇的文件夹中,我们可以为我们的外观添加一个新的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
}
}
Run Code Online (Sandbox Code Playgroud)
getFacadeAccessor因为您需要在一瞬间.另请注意,您正在此处扩展现有的Facade类.
php artisan所以现在我们需要一个新的提供者.谢天谢地,我们有一个很棒的artisan工具.在我的情况下,我会打电话给它FooProvider.
php artisan make:provider FooProvider
Run Code Online (Sandbox Code Playgroud)
巴姆!我们有一个提供者.阅读更多有关服务提供商的信息 现在只知道它有两个函数(boot和register),我们将添加一些代码register.我们将绑定我们的新提供商我们的应用程序:
$this->app->bind('foo', function () {
return new Foo; //Add the proper namespace at the top
});
Run Code Online (Sandbox Code Playgroud)
因此,这bind('foo'部分实际上将与您在FooFacade.php代码中添加的内容相匹配.在我return 'foo';之前说过的地方,我想要这个绑定来匹配它.(如果我说过return 'wtv';我会bind('wtv',在这里说.)
此外,我们需要告诉Laravel在哪里找到Foo!
所以在顶部我们添加名称空间
use \Foobar\Foo;
Run Code Online (Sandbox Code Playgroud)
立即查看整个文件:
<?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;
});
}
}
Run Code Online (Sandbox Code Playgroud)
Foobar\Foo而不是Foobar\Facades\Foo- 您的IDE可能会建议错误完成.config/app.php现在我们必须告诉Laravel我们有兴趣使用我们刚刚创建的这些随机文件,我们可以在我们的config/app.php文件中执行此操作.
将您的提供者类引用添加到'providers':App\Providers\FooProvider::class
将facade类引用添加到'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
}
Run Code Online (Sandbox Code Playgroud)
好的,既然你已经改变了所有,那么你需要的最后一件事就是刷新作曲家和工匠的缓存.试试这个:
composer dumpautoload
php artisan cache:clear
Run Code Online (Sandbox Code Playgroud)
在app/routes.php以下位置创建路线:
Route::get('/foobar', 'FooBarController@testFoo');
Run Code Online (Sandbox Code Playgroud)
然后跑
php artisan make:controller FooBarController
Run Code Online (Sandbox Code Playgroud)
并添加一些代码,所以它现在看起来像这样:
<?php
namespace App\Http\Controllers;
use Foobar\Facades\Foo;
use App\Http\Requests;
class FooBarController extends Controller
{
public function testFoo()
{
dd(Foo::Bar());
}
}
Run Code Online (Sandbox Code Playgroud)
你应该得到以下字符串:
Foobar\Facades\Foo,请尝试运行php artisan optimize