我在使用Laravel创建立面模型类时遇到了一些问题。我已经关注了http://laravel.com/docs/facades,但是我想我缺少了一些东西。
我创建了一个文件夹app/models叫foo。在那个文件夹中,我有两个文件。
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 => '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。我究竟做错了什么?
Foo::method()
Non-static method Mynamespace\Foo::method() should not be called statically
facades在app文件夹(app/facades)中创建一个名为的文件夹。
facades
app
app/facades
将立面文件夹添加到您的作曲家自动加载中。
"autoload": { "classmap": [ ... "app/facades" ] },
在该文件夹(FooFacade.php)中创建一个Facade文件,并添加以下内容:
FooFacade.php
<?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)中创建一个模型。
MyClass.php
<?php namespace MyNamespace; use Eloquent; // if you're extending Eloquent class MyClass extends Eloquent { ... }
创建一个新的服务提供商(您可以在应用程序中创建一个名为的文件夹serviceproviders,并将其添加到composer自动加载中)(app/models/MyClassServiceProvider.php)。
serviceproviders
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
config/app.php
'providers' => array( ... 'MyServiceProvider' )
运行,composer dump以便我们可以访问我们的新类。
composer dump
您现在可以MyClassAlias::method()作为外观访问。
MyClassAlias::method()