首先什麼是service , 日常php應用中 , 例如開發一個社交網站 , 會使用DBO session 郵件功能 日誌功能 oauth驗證 以及第三方平臺接入的api , 甚至圖片新增水印剪裁等操作 凡是涉及到引數固定的一些元件( 如果有多種引數的話我們可以寫多個service ) 都可以設定成服務 這樣達到一次初始化 然後到處都能快速使用的目的 複雜元件的複用可以為我們的提高程式的效能 , 本文just for初學者
例子裡用一個非常簡單的寫日誌的服務來演示
第一步 建立服務 LogService
在當前bundle目錄下建立Service目錄 然後建立LogService.php檔案 我這裡是src/Milk/CoffeeBundle/Service/LogService.php
<?php
/**
* Created by PhpStorm.
* User: mot
* Date: 14-2-6
* Time: 上午6:50
*/
namespace MilkCoffeeBundleService;
class LogService {
protected $log;
protected $config;
protected $file;
protected $line;
public function __construct( $config)
{
$this->config = $config;
}
public function exception_path($file, $line)
{
$this->file = $file;
$this->line = $line;
return $this;
}
public function writeLog( $log)
{
if( FALSE == file_exists( $this->config[`log_path`]))
{
file_put_contents( $this->config[`log_path`] , ``);
}
$this->log = "[".date(`Y-m-d h:i:s`)."] - ".$this->file.":line ".$this->line
." Exception : " .$log. "
";
return $this;
}
public function flush()
{
file_put_contents( $this->config[`log_path`] , $this->log , FILE_APPEND );
return $this;
}
public function readLog()
{
$log = file_get_contents( $this->config[`log_path`]);
if( ! $log)
return FALSE;
$log = explode("
" , $log);
$log = implode(`<br/>` , $log);
return $log;
}
}
這是我定義的一個小log類 功能比較簡單 exception_path記錄日誌發生位置 writeLog修改日誌內容 flush把日誌寫入檔案 readLog讀取日誌檔案
第二步 新增定義跟引數 在當前bundle下面的Resources/config/services.yml
我的services.yml位置是 src/Milk/CoffeeBundle/Resources/config/service.yml
parameters:
milk_coffee.log.class: MilkCoffeeBundleServiceLogService
milk_coffee.log.config:
log_path: c:/file_system.log
services:
milk_coffee.log:
class: %milk_coffee.log.class%
arguments: [%milk_coffee.log.config%]
這裡解釋一下
parameters:
milk_coffee.log.class: MilkCoffeeBundleServiceLogService
milk_coffee.log.config:
log_path: c:/file_system.log
這是我們要用的引數 例如我們要寫log 需要提供log檔案的位置 這裡提供了檔案的位置
c:/file_system.log
在yml解析之後
milk_coffee.log.config:
log_path: c:/file_system.log
這個格式就是一個php陣列 array( `log_path` => `c:/file_system.log` );
這裡是我們定義服務class的位置
services:
milk_coffee.log:
class: %milk_coffee.log.class%
arguments: [%milk_coffee.log.config%]
“%”中的變數是我們上面定義的引數%
%milk_coffee.log.class% 即對應 “MilkCoffeeBundleServiceLogService”
%milk_coffee.log.config% 即對應 “log_path: c:/file_system.log”
這樣服務就定義好了
第三步 在我們的邏輯程式碼中使用服務
<?php
namespace MilkCoffeeBundleController;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationResponse;
class DefaultController extends Controller
{
public function indexAction($name)
{
// if( FALSE === $this->get(`milk_coffee.log`)->readLog())
$this->get(`milk_coffee.log`)
->exception_path(__FILE__,__LINE__)
->writeLog(`First log`)
->flush();
return new Response( $this->get(`milk_coffee.log`)->readLog() , 200);
//return $this->render(`MilkCoffeeBundle:Default:index.html.twig`, array(
`name` => $name));
}
}
這裡用 $this->get(`milk_coffee.log`) 就獲得了我們LogService的例項 省去了 new LogService( array() ) 這種過程 而且在當前bundle的邏輯程式碼中隨處可用
milk_coffee.log是我們定義在Resources/config/service.yml中的服務名
訪問這個控制器的路由地址 就可以看到效果了