关于 laravel 的很多理解还是比较缺乏,最近看 laravel 学院的基础教程,这里把我的个人理解放这里,方便日后温故。
原理概括
- 第一步定义服务类。也就是我们具体的逻辑方法等,定义这个类又应该有契约约束,所以定义接口并让服务类继承实现,所以第一步是包括服务类和接口的定义。
- 第二步定义服务提供者。服务有了,需要专人负责实时所提供的服务,实例化对象和绑定在这里完成。
- 第三步注册服务。公司装修好了,设备也都能运转了,可要是向所有人提供服务就需要获得政府的认可和注册,告诉政府公司地址,以便管控。
- 第四步开店营业。所有事务都以准备完毕,可以开张营业了,店面负责展示和向公司提交订单等业务逻辑(路由、控制器和视图)。
案例实现
1、定义服务类
按照正常思维逻辑,我们需要实现某功能或服务,现在,我们创建服务类,考虑到创建服务类应该先创建其接口来约束该类,所以我们要先创建这个约束其行为的接口app\TestContracts\TestContract.php
:
<?php
namespace App\Contracts;
interface TestContract { public function callMe($controller); }
|
然后我们来定义针对这个接口的实现,具体的服务逻辑app\Services\TestService.php
:
<?php
namespace App\Services;
use App\Contracts\TestContract;
class TestService implements TestContract { public function callMe($controller) { dd('Call Me From TestServiceProvider In '.$controller); } }
|
2、创建服务提供者
第一步是为了制造机器,机器制造好了,需要用好机器,服务提供者就是用机器的人,绑定和实例化应该是在这里完成。
定义一个服务提供者TestServiceProvider
,运行下面的命令:
php artisan make:provider TestServiceProvider
|
成执行会在app/Providers
目录下生成一个TestServiceProvider.php
文件,我们修改其内容如下:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider; use App\Services\TestService;
class TestServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // }
/** * Register the application services. * * @return void * @author LaravelAcademy.org */ public function register() { //使用singleton绑定单例 $this->app->singleton('test',function(){ return new TestService(); });
//使用bind绑定实例到接口以便依赖注入 $this->app->bind('App\Contracts\TestContract',function(){ return new TestService(); }); } }
|
register()
方法里的这两种绑定方式是由区别的,可以参考服务容器文档了解更多。
3、注册服务提供者
服务提供者多了,系统难免难于管理,为了更有条理的管理好各类服务提供者,应该有政府出面来负责各类服务的注册,注册的意思就是说,只有在政府注册了的公司才可以合法经营。
laravel 所有的注册都是在config/app.php
里。我们在provider
数组里追加我们新增加的服务:
// 更多
'providers' => [
//其他服务提供者
App\Providers\TestServiceProvider::class, ],
// 更多
|
4、测试服务提供者
这里包括创建测试用控制器和视图,添加测试用路由等。
创建控制器
创建TestController
控制器,运行:
php artisan make:controller TestController
|
控制器内容为:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests; use App\Http\Controllers\Controller;
use App; use App\Contracts\TestContract;
class TestController extends Controller { //依赖注入 public function __construct(TestContract $test){ $this->test = $test; }
/** * Display a listing of the resource. * * @return Response * @author LaravelAcademy.org */ public function index() { // $test = App::make('test'); // $test->callMe('TestController'); $this->test->callMe('TestController'); }
...//其他控制器动作 } |