初入
- Contracts(契约),也就是接口。定义一些方法,所以实现此接口的类都要实现契约里边的方法。
-
ServiceContainer (契约的具体实现) ,实现
Contracts
。具体实现逻辑写在这里。 -
ServiceProvider (服务提供者) ,绑定事务到服务容器。
-
App (服务容器), 在服务提供者中,可以通过
$this->app
或App::
得到。App::
其实就是门面。 -
Facades(门面), 简化服务提供者的调用方式,用静态的方式调用具体实现里的方法。
具体
通过依赖注入,反射,实现了服务的功能。契约定义好服务所需要的接口,当然也可以不需要这个。当类似抽象功能多的时候,还是实现的好。然后,定义契约的实现。在服务提供者中,将服务绑定到容器。最后,在 config\app.php
中的providers
,加入服务提供者。如果想使用门面,创建一个门面,然后在门面中重写getFacadeAccessor
。最后,也是要在 config\app.php
中的aliases
加入门面。
定义契约
<?php
namespace App\Contracts;
interface ViniContract
{
public function tell($value);
}
建立契约的实现
<?php
namespace App\ServicesContainer;
use App\Contracts\ViniContract;
class ViniService implements ViniContract
{
public function tell($value)
{
echo('viniService->tell->' . $value . '<br/>');
}
}
建立服务提供者
我们通过 artisan 创建: php artisan make:provider ViniServiceProvider
。在register中,实现绑定。当然,你也可以手动创建。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\ServicesContainer\ViniService;
use App;
class ViniServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
App::bind('vini', function(){
return new ViniService();
});
}
}
修改
config\app.php
,在 providers 中加入服务提供者
/*config\app.php*/
'providers' => [
…,
App\Providers\ViniServiceProvider::class,
]
建立控制器
我们通过 artisan 创建: php artisan make:controller ViniController
。当然,你也可以手动创建,继承Controller即可。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\ServicesContainer\ViniService;
use App\Facades\ViniFacade;
class ViniController extends Controller
{
//
protected $vini;
public function __construct(ViniService $vini)
{
$this->vini = $vini;
}
public function index()
{
$this->vini->tell('i am vini');
//ViniFacade::tell('i am facade');
}
}
添加路由
在 routes\web.php
中添加一条路由。
Route::get('vini', 'ViniController@index');
一切就绪,在浏览器中访问测试。
如果一切正常,你会发现在浏览器中输出 viniService->tell->i am vini
。
门面的实现
在以上的基础上,进一步实现门面。
创建门面
门面需要继承 Facade
,并重写 getFacadeAccessor
方法。
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class ViniFacade extends Facade
{
protected static function getFacadeAccessor()
{
return 'vini';
}
}
在
config\app.php
的aliases
中加入门面。
/*config\app.php*/
'aliases' => [
…,
'Vini' => App\Facades\ViniFacade::class,
]
然后,在上边的controller解开对门面使用的注释。在浏览器中访问。如果一切正常,你会发现浏览器中输出:
viniService->tell->i am vini
viniService->tell->i am facade
最后
门面虽然使用起来很方便,但是不能够直接跳转到对应的方法内部,也不能直观的去了解这个方法的用法。
laravel里的服务容器,服务提供者,契约以及门面的内容还有很多。这个只是简单的开始。