Głównym celem DIC-a jest całościowe przygotowanie "usługi". Zauważ, że w większości przypadków nie wystarczy
$a = new A();. Trzeba jeszcze jakieś tam parametry w konstruktorze / setterach przekazać, a każdy z tych parametrów sam w sobie może wymagać dokładnie takiej samej konfiguracji, gdzie i owa konfiguracja również może wymagać własnej konfiguracji - sporo tego co nie?
Weźmy za przykład wspomnianego przez Ciebie mailera. Taka usługa potrzebować będzie kilku zależności i kilku parametrów konfiguracyjnych. W końcu wysłanie maila to dosyć skomplikowana operacja, która może zostać zrealizowana na wiele sposobów. Nagle zamiast prostego
new Mailer() robi się coś w stylu:
$a = new A();
$b = new B('param1', 'param2');
$c = new C($a, 22);
$c->setABC('def', array('a' => 'a', 'b' => 'b', 'c' => 'c'));
$mailer = new Mailer($b, $c, true);
$mailer->setSth(null);
// dopiero tutaj $mailer to w pełni funkcjonalny obiekt
Trochę nieciekawa perspektywa zważywszy na fakt, że dostęp do takiej usługi jest potrzebny w co najmniej kilkunastu miejscach w normalnej aplikacji. Znacznie wygodniej przenieść sobie całą konfigurację usługi gdzieś w inne miejsce by nie zaśmiecać sobie normalnego kodu takimi potworkami, prawda? Kilka osobnych plików XML (od biedy YAML), grupujących usługi z obrębu aplikacji to zdecydowanie przyjemniejsze środowisko do pracy.
Oczywiście fakt istnienia DIC-a nie oznacza, że nigdy nie wolno Ci użyć "czystego"
$myService = new MyService(123);.
Co do tych stałych... nie przesadzaj z tymi literówkami. Akurat w tym przypadku wystąpienie jakiejkolwiek to w zasadzie gwarancja wysypania się całej aplikacji. Jednak jeżeli naprawdę tak Ci na tym zależy sam możesz sobie takie wygenerować - to dosłownie chwila roboty. W głównym Bundle'u swojej aplikacji dodaj
CompilerPass'a:
namespace MyApp\RootBundle\DependencyInjection\Compier;
use ...;
use ...;
use ...;
class MyPass implements CompilerPassInterface {
public function process(ContainerBuilder $container) {
$services = array_keys($container->getDefinitions());
$output = "<?php \n";
foreach ($services as $service) {
$output .= sprintf("define('%s', '%s');\n
", 'SERVICE_' . strtoupper(str_replace(array('.', '-'), array('_', '_'), $service)), $service); }
file_put_contents('/path/to/file', $output);
}
}
A w bootstrapie dołącz sobie plik
/path/to/fileCytat
oddzielic singleton od implementacji - znalazlem na stronie z jakimis refaktoryzacjami porade ze jesli juz musisz uzyc singletonu to by część "pracującą" wrzucić do jednej klasy, której instancje mozna stworzyc normalnie na potrzeby unit testu, i stworzyc druga klase opakowujaca tego workera w singleton, ktory bedzie sobie normalnie dzialal w programie. o to mi chodzilo.
Rozumiem już o co Ci chodzi, ale nazwa "oddzielic singleton od implementacji" to kompletny bełkot, więc więcej tego nie używaj.

Cytat
no i przy automatycznych zmianach nazw wszystkie IDE do php sie czasami mylą, nie ma idealnego pod tym względem. a znajdz/zamien potrafi narobic sporo bałaganu
No niestety narzędzia dla PHP są naprawdę wątpliwej jakości w większości. Ale cóż... PHP to bardzo dynamiczny język co właściwie uniemożliwia istnienie takich narzędzi, a i o społeczności skupionej wokoło tego języka w samych superlatywach mówić nie można.

PS. W Symfony2 od co najmniej pół roku kompletnie nic nie robiłem, więc mogło się tam coś pozmieniać - za podany gotowiec nie ręczę.