对于一个框架的service,就可以理解为任何一个执行一些全局任务的php对象。无论何时需要调用他们,他们都存在,可以为我们提供服务。 其实服务是一个类库的封装,这些类可以完成一些功能,但是只有一个类被暴露出来,来提供一个可以来完成所有事情的接口。
服务与依赖注入
它的思想就是提供了一个容器(Container)来注册这些服务,取的时候直接从容器获取即可。
恩 ,每个框架都有它独特的实现机制,都是个独立的思想。
myBundle的DependencyInjection目录下有两个文件是sf给提供的服务Configuration.php和MyExtension.php
我们在这创建一个自己的服务,可以理解为一个类的集合。Person.php
name = $name;
$this->gender = $gender;
}
public function setMsg($name = "未知姓名","未知性别"){
$this->name = $name;
$this->gender = $gender;
}
public function getMsg(){
$str = '';
$str = "当前姓名是:".$this->name."
";
$str = "当前性别是:".$this->gender."
";
return $str;
}
}
?>
之后要注入服务,在MyBundle目录下的Resources目录下的config目录下有一个services.yml的文件
需要在services.yml的文件中添加内容 类地址MyBundle\DependencyInjection\Person 服务名Person 构造函数的参数"未知姓名","未知性别"
services:
person:
class:MyBundle\DependencyInjection\Person
arguments:["未知姓名","未知性别"]
这样类被注入到了服务列表了,然后可以调用它了,在routing.yml中添加路由my_servpage
my_servpage:
path: /my/serv
defaults:{_controller:MyBundle:Default:serv}
路由添加完毕后就可以在控制器里写一个Action了
public function servAction(){
$serv = $this->get('person'); //根据服务器名获取服务,得到类的对象
$serv -> setMsg("王者荣耀","女"); //给变量赋值,设置属性
$str = $serv->getMsg(); //获取变量的值,调用对象
return new Response($str); //输出
}
这样就简历了自己的服务,并在控制器中使用。
服务在symfony中并不是一个特别复杂的概念,我们可以理解为很多框架中的函数库,所不同的是,
它是把库直接注入到容器中,在使用的时候直接使用get(“服务名”)的格式就可以了。
如果不适用依赖注入的话是这样调用的:
在指定位置创建类,通常是lib或者vender等目录,在使用的时候导入或者自动加载,然后实例化。
这中方式的耦合性非常强,导致程序灵活性极度下降。
对于依赖注入的我们的整体流程如下:
创建一个类,然后把它注册到相应容器中
直接根据名字来获取这个类的一个实例。
这样的好处:类的地址更加自由,不用非得写到vendor目录下面,只要注册的时候根据路径能找到它即可。
类的命名更加自由,不管是什么,直接注入进去。解耦。
很多新一代的框架都提出了服务的概念,对于symfony来说由于我们代码是划分为一个个Bundle的,因此服务可以
直接写在bundle中。一般由于服务都使用了延迟加载的机制,因此我们并不担心它的性能问题,而且我们不必知道具体
的类名,这样我们在开发的时候会很方便。