我在使用Laravel创建Facade模型类时遇到了一些问题。我跟着http://laravel.com/docs/facades,但我想我错过了什么。
我在app/models
中创建了一个名为foo
的文件夹。在该文件夹中,我有两个文件。
第一个文件(Foo.php):
<?php
namespace Mynamespace;
class Foo {
public function method() {
}
}
?>
第二个文件(FooFacade.php):
<?php
use Illuminate\Support\Facades\Facade;
class Foo extends Facade {
protected static function getFacadeAccessor() { return 'foo'; }
}
?>
然后我将Foo => 'Mynamespace\Foo'
添加到aliases
中的app/config/app.php
数组,并运行composer update
和composer dump-autoload
。
现在,当我尝试运行Foo::method()
时,我得到Non-static method Mynamespace\Foo::method() should not be called statically
。我做错了什么?
答案 0 :(得分:49)
在facades
文件夹(app
)中创建名为app/facades
的文件夹。
将facade文件夹添加到您的composer autoload。
"autoload": {
"classmap": [
...
"app/facades"
]
},
在该文件夹(FooFacade.php
)中创建Facade文件并添加以下内容:
<?php
use Illuminate\Support\Facades\Facade;
class MyClass extends Facade {
protected static function getFacadeAccessor() { return 'MyClassAlias'; } // most likely you want MyClass here
}
在app/models
(MyClass.php
)中创建模型。
<?php
namespace MyNamespace;
use Eloquent; // if you're extending Eloquent
class MyClass extends Eloquent {
...
}
创建新的服务提供商(您可以在应用中创建名为serviceproviders
的文件夹并将其添加到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;
});
}
}
如果你想要另一个外观,你可以在这里添加新的绑定(如果是这样的话,不要忘记创建一个外观文件)。
将服务提供商添加到providers
中的config/app.php
数组。
'providers' => array(
...
'MyServiceProvider'
)
运行composer dump
,以便我们可以访问我们的新课程。
您现在可以访问MyClassAlias::method()
作为外观。
答案 1 :(得分:3)
在帖子中对此进行了很好的解释:http://fideloper.com/create-facade-laravel-4
希望有所帮助
答案 2 :(得分:1)
第1步:创建服务提供商
<?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;
});
}
}
步骤2:创建Façade类,扩展Illuminate \ Support \ Facades \ Facade类。
<?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'
}
}
步骤3:创建要添加功能的类(TestFacade.php)。
<?php
namespace App;
class TestFacade{
public function dummy(){
return "Business Logic ";
}
}
步骤4:注册服务提供商并在Config \ App.php中提供别名
'providers' => [ //...
App\Providers\NewFacadeServiceProvider::class
],
//Class Aliases
'aliases' => [ //...
'FacadeTester' => App\Facade\TestFacade::class,
]
调用Route.php函数:
Route::get('/skull',function(){
return FacadeTester::dummy();
});
Controller中的调用功能:
return \FacadeTester::dummy();
答案 3 :(得分:0)
简单的Laravel 5方法:
要创建Facade,您需要3个组件:
以下是一个完整示例:在示例中,我正在为ModulesConfig
类创建Facade ModulesConfigReaderService
。
1)需要通过外观访问的服务类
<?php
namespace Hello\Services\Configuration\Portals;
use Illuminate\Support\Facades\Config;
class ModulesConfigReaderService
{
public function getSomething()
{
return 'Whatever';
}
}
这是一个非常正常的课程
2)门面需要上课
<?php
namespace Hello\Services\Configuration\Facade;
use Illuminate\Support\Facades\Facade;
class ModulesConfig extends Facade
{
protected static function getFacadeAccessor()
{
return 'modulesConfigReaderService';
}
}
从Facade扩展的简单类
3)服务提供商
<?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');
});
}
}
将所有内容绑定在一起的服务提供商。
<强> USAGE:强>
1)通常注册服务提供商
2)通过门面访问服务类
$whatever = ModulesConfig::getSomething();