可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm having a little problem with creating a facade model class with Laravel. I have followed http://laravel.com/docs/facades but I guess I'm missing something.
I have created a folder in app/models
called foo
. In that folder I have two files.
First file (Foo.php):
<?php
namespace Mynamespace;
class Foo {
public function method() {
}
}
?>
Second file (FooFacade.php):
<?php
use Illuminate\Support\Facades\Facade;
class Foo extends Facade {
protected static function getFacadeAccessor() { return 'foo'; }
}
?>
Then I added Foo => 'Mynamespace\Foo'
to the aliases
array in app/config/app.php
and ran composer update
and composer dump-autoload
.
Now when I try to run Foo::method()
I get Non-static method Mynamespace\Foo::method() should not be called statically
. What am I doing wrong?
回答1:
Step 1
Create a folder called facades
in your app
folder (app/facades
).
Step 2
Add the facade folder to your composer autoload.
"autoload": {
"classmap": [
...
"app/facades"
]
},
Step 3
Create a Facade file in that folder (FooFacade.php
) and add this content:
<?php
use Illuminate\Support\Facades\Facade;
class MyClass extends Facade {
protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here
}
Step 4
Create a model in app/models
(MyClass.php
).
<?php
namespace MyNamespace;
use Eloquent; // if you're extending Eloquent
class MyClass extends Eloquent {
...
}
Step 5
Create a new service provider (you can create a folder in app called serviceproviders
and add it to composer autoload) (app/models/MyClassServiceProvider.php
).
<?php
use Illuminate\Support\ServiceProvider;
class MyClassServiceProvider extends ServiceProvider {
/**
* Register the service provider.
*
* @return void
*/
public function register() {
$this->app->bind('MyClassAlias', function(){
return new MyNamespace\MyClass;
});
}
}
Here you can add new binding if you want another facade (don't forget to create a facade file if so).
Step 6
Add the service provider to the providers
array in config/app.php
.
'providers' => array(
...
'MyServiceProvider'
)
Step 7
Run composer dump
so we can access our new classes.
Step 8
You can now access MyClassAlias::method()
as a facade.
回答2:
It's well explained in that post: http://fideloper.com/create-facade-laravel-4
Hope it helps
回答3:
Step 1: Create Service provider
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class NewFacadeServiceProvider extends ServiceProvider{
public function register(){
$this->app->singleton('TestFacades',function() {
//'TestFacades' alias name for the façade class
return new \App\TestFacade;
});
}
}
Step 2: Create Façade class which extends Illuminate\Support\Facades\Facade class.
<?php
namespace App\Facade; //created 'facade' folder in app directory
use Illuminate\Support\Facades\Facade;
class TestFacade extends Facade{
protected static function getFacadeAccessor() {
return 'TestFacades'; //'TestFacades' alias name for the façade class declare in the class 'NewFacadeServiceProvider'
}
}
Step 3: Create the class(TestFacade.php) where you want to add functions.
<?php
namespace App;
class TestFacade{
public function dummy(){
return "Business Logic ";
}
}
Step 4: Register service provider and provide alias name in Config\App.php
'providers' => [ //...
App\Providers\NewFacadeServiceProvider::class
],
//Class Aliases
'aliases' => [ //...
'FacadeTester' => App\Facade\TestFacade::class,
]
Call the function Route.php:
Route::get('/skull',function(){
return FacadeTester::dummy();
});
Call function in Controller:
return \FacadeTester::dummy();
回答4:
A simple Laravel 5 methode:
To create a Facade you need 3 components:
- The wanna be Facade Class, the class that needs to become accessible via facade.
- The Facade required Class.
- The Service Provider, which registers the Facade class in the App container
Here's a full example: in the example I'm creating the Facade ModulesConfig
for the ModulesConfigReaderService
class.
1) the service class that needs to become accessible via a facade
<?php
namespace Hello\Services\Configuration\Portals;
use Illuminate\Support\Facades\Config;
class ModulesConfigReaderService
{
public function getSomething()
{
return 'Whatever';
}
}
this is a very normal class
2) the facade required class
<?php
namespace Hello\Services\Configuration\Facade;
use Illuminate\Support\Facades\Facade;
class ModulesConfig extends Facade
{
protected static function getFacadeAccessor()
{
return 'modulesConfigReaderService';
}
}
simple class extending from the Facade
3) the service provider
<?php
namespace Hello\Services\Configuration\Providers;
use Hello\Modules\Core\Providers\Abstracts\ServiceProvider;
class ModulesConfigServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind('modulesConfigReaderService', function(){
return $this->app->make('Hello\Services\Configuration\Portals\ModulesConfigReaderService');
});
}
}
a service provider that binds everything together.
USAGE:
1) register the service providers normally
2) access the service class via the facade
$whatever = ModulesConfig::getSomething();