2016-02-20 2 views
1

Я новичок в Symfony, и я не понимаю, преимущества использования сервиса вместо написать Cose в контроллереКаково главное преимущество использования сервиса в Symfony?

Для примера, у меня есть сервис, который Создать Войти с помощью следующего кода:

 $path = $root.'/../web'; 
     $fs->touch($path.'/log.txt'); 
     $this->file = $path.'/log.txt'; 
     file_put_contents($this->file, $msg, FILE_APPEND | LOCK_EX); 

Я могу поместить этот вход в систему с помощью DIC ($ fs является службой FileSystem), или я могу поместить этот вход на свой контроллер.

Конечно, если мне нужно часто регистрироваться, я должен написать тот же код. Главное преимущество - развязка?

спасибо

ответ

-1

Главная цель и преимущество услуг является то, что держать повторно используемый код и использовать СУХОЙ подход.

Конечно, есть много других преимуществ, которые вы открываете постепенно, когда используете их.

Услуги доступны из любого контекста вашего приложения, которое может обращаться к контейнеру обслуживания, а не только к контроллерам.

Если без обслуживания несколько строк кода, которые вы указали, будут дублированы в нескольких методах/контекстах, вы должны сохранить свою службу.
В противном случае удалите его и выполните свою логику в определенном методе.

Я думаю, что лучший подход к их использованию - по собственному желанию.
Не пытайтесь создавать службы в предотвращении, используйте их, чтобы решить настоящую потребность.

Если у вас есть код кода, который дублируется, вы должны, естественно, избежать его, создав службу (или другую AbstractController, что ваши контроллеры могут расширять и наследовать блок кода).

Цель: Всегда сохранять световой код и избегать дубликатов, насколько это возможно.
Для этого вы можете использовать мощные сервисы Symfony или просто использовать наследование классов и других принципов POO.

+0

Отлично! Это то, что я ищу! – mustache

1

Предположим, у вас есть Бар класс, который использует BasicLogger.

У вас есть несколько способов получить доступ к регистратору, позволяет начать с наиболее простым вариантом:

<?php 

class Bar 
{ 
    public function bar() 
    { 
     $logger = new BasicLogger(); 
     $logger->log("foo"); 
    } 
} 

Это плохая практика, потому что мы смешиваем строительство логику с логикой приложения. Он по-прежнему работает, но имеет следующие недостатки:

  • Он смешивает обязанности.
  • Бар становится трудно тестировать и не может быть протестирован без побочных эффектов.
  • Мы не можем динамически изменять регистраторы (код менее многоразовый).

Для решения этих недостатков, мы можем вместо этого требуют нашего Logger класса через конструктор.

Наш код теперь выглядит следующим образом:

class Bar 
{ 
    private $logger; 

    public function __construct(Logger $logger) 
    { 
     $this->logger = $logger; 
    } 

    public function bar() 
    { 
     $this->logger->log("foo"); 
    } 
} 

Великий, наш класс больше не отвечает за создание регистратора, мы можем проверить наш код без побочных эффектов (и сделать утверждения против как был использован регистратор) и теперь мы можем использовать любой регистратор, который нам нравится.

Итак, теперь мы используем наш новый класс по всему приложению.

$logger = new Logger(); 
$bar = new Bar($logger); 

Посмотрите знакомы? Снова мы смешиваем логику построения с логикой приложения, о которой мы уже знаем, плохо.

Не только это, но что-то еще хуже происходит здесь, Копирование дублирования.

Правильно. и каждый раз, когда мы хотим использовать наш класс Bar, дублирование ухудшается.

Решение? Используйте Service container

Регистрация вашего регистратора в качестве сервиса означает, что весь ваш код, который нуждается в функциях ведения журнала, больше не зависит от вашего конкретного регистратора, обязанности не будут смешиваться, дублирование кода будет уменьшено, и ваш дизайн станет больше гибкий.

Смежные вопросы