初學者在symfony2開發中使用service

mot發表於2014-02-06

首先什麼是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中的服務名

訪問這個控制器的路由地址 就可以看到效果了

相關文章