Paweł
Koralewski
starszy programista,
wiem ile nie wiem
Temat: [Sf2] odpowiednik sfConfig
W sf1 była globalna klasa, która dawała dostęp do dowolnej opcji konfiguracyjnej:sfConfig::get('optionname', 512); z każdego miejsca aplikacji. Jaki jest jej odpowiednik w Sf2?
Aleksander Wons Aplikacje webowe
Temat: [Sf2] odpowiednik sfConfig
Przykład odwołania w kontrolerze:
$this->container->getParameter('param_name');
Oczywiście parametr zdefiniowany w config.yml tak:
parameters:
param_name: 'ala ma kota'
Paweł
Koralewski
starszy programista,
wiem ile nie wiem
Temat: [Sf2] odpowiednik sfConfig
W kontrolerze to wiem, już znalazłem. A w modelu (mapperze)? Gdzie mam coś takiego:<?php
namespace Alden\xxx\Model;
use Alden\xxx\Entity\Product;
class ProductManager {
function ax() {
$param = ???
return array(
new Product('p3')
);
}
}?>
Aleksander Wons Aplikacje webowe
Temat: [Sf2] odpowiednik sfConfig
http://stackoverflow.com/questions/5295588/doctrine-2-...W kontruktorze się nie da, ale można pokombinować z setterem. Pytanie czy na pewno jest Ci to potrzebne. Czy może wystarczy ten parametr przekazać do funkcji jako argument?
Piotr Walków Symfony2
Temat: [Sf2] odpowiednik sfConfig
Aleksander Wons:
http://stackoverflow.com/questions/5295588/doctrine-2-...
W kontruktorze się nie da, ale można pokombinować z setterem. Pytanie czy na pewno jest Ci to potrzebne. Czy może wystarczy ten parametr przekazać do funkcji jako argument?
Co co znaczy ze sie nie da???
services.[yml]
parameters:
whatever_manager.class: Acme\SomeBundle\Entity\WhateverManager
whatever_manager_param: siedemnascie
services:
acme.whatever_manager:
id: whatever_manager
class: %whatever_manager.class%
arguments: [%whatever_manager_param:%]
whateverManager:
class WhateverManager
{
private $paramFromTheSky;
public function __construct($paramFromTheSky)
{
$this->paramFromTheSky = $paramFromTheSky;
}
}
Ps Lepiej nic nie pisac jak sie nie wie niz pisac, ze sie nie da.
Paweł
Koralewski
starszy programista,
wiem ile nie wiem
Temat: [Sf2] odpowiednik sfConfig
OK, ale to rozumiem, że w Twoim WhateverManager jest usługą. A jeśli nie jest, w kodzie akcji wywołuję go:use Alden\xxx\Model\ProductManager;
...
$m = new ProductManager();
I tak w kilkunastu miejscach i nie chcę za każdym razem podawać tych samych parametrów, tym bardziej że nie będą się one zmieniać wraz z życiem aplikacji.Paweł Koralewski edytował(a) ten post dnia 03.11.11 o godzinie 22:55
Aleksander Wons Aplikacje webowe
Temat: [Sf2] odpowiednik sfConfig
Piotr Walków:
Ps Lepiej nic nie pisac jak sie nie wie niz pisac, ze sie nie da.
A to przepraszam. Nie wiedziałem, że Entity w Doctrine to service... Rozłożyłeś mnie na łopatki swoją wiedzą.
Czyli jak robie
new Entity();
to injectuje mi w jakiś cudowny sposób containter do tego entity? Skoro tak to gratuluje pomysłowości.
Więc najlogiczniej zrobić tak jak w opisanym poście. Podłączyć się pod stosowny event podczas tworzenia entity i setterem ustawić containter.
Piotr Walków Symfony2
Temat: [Sf2] odpowiednik sfConfig
Równie dobrze mozesz uzyc jednego pliku z wlasna konfiguracja i wyciagac go za pomoca:use Acme\SomeBundle\Utits\SomeParameters;
...
{
$param = SomeParameters::$parameterFromTheSky;
}
Paweł
Koralewski
starszy programista,
wiem ile nie wiem
Temat: [Sf2] odpowiednik sfConfig
Piotr Walków:
Równie dobrze mozesz uzyc jednego pliku z wlasna konfiguracja ...
Owszem, ale to jest niespójne z całą koncepcją Sf2. Oczywiście nie upieram się, że rozwiązanie, które ja chcę zastosować, jest zgodne :) W ogóle nie wiem, czy ono jest poprawne, tzn. czy tworzyć managery jako osobne klasy. Tak robiłem w sf1 i wewnątrz miałem potrzebne metody zadeklarowane statycznie.
Aleksander Wons Aplikacje webowe
Temat: [Sf2] odpowiednik sfConfig
Może po prostu dla spokoju przekazuj te parametry jako argumenty wywołania i problemu nie będzie.EDIT.
Zresztą po co Ci oddzielny manager skoro jest repository? Możesz tam spokojnie dodać potrzebne metody i im przekazywać potrzebne parametry w arumentach wywołania.Aleksander Wons edytował(a) ten post dnia 04.11.11 o godzinie 08:50
Paweł
Koralewski
starszy programista,
wiem ile nie wiem
Temat: [Sf2] odpowiednik sfConfig
A jeśli nie chcę (celowo) używać Doctrine?
Aleksander Wons Aplikacje webowe
Temat: [Sf2] odpowiednik sfConfig
No to odpowiedź już dał Piotr.Robisz service i jako parametr kontruktora dodajesz container. I wtedy masz zasze dostęp do kontenera i dzięki temu do parametrów.
Alan Gabriel B. Programista
Temat: [Sf2] odpowiednik sfConfig
Paweł, szukasz dziury w całym. Przyjmij po prostu jako rule of thumb, że przekazywanie kontenera do modelu jest zwyczajnie złym pomysłem.Projektując dziedzinę (zbiór klas odpowiedzialnych za logikę biznesową w projekcie) należy pamiętać, żeby zachować jak najmniejszą liczbę zależności dla klasy A (Zakładając, że jeżeli klasa B jest zależnością A, a klasa C jest zależnością B to C jest również zależnością A). Taki graf klas jest łatwiejszy do ogarnięcia i instancjonowania.
Posłuchaj się Aleksandra i przekazuj zmienną jako parametr - to jest po prostu najelegantsze rozwiązanie i najmniej problematyczne.
Paweł Koralewski:
A jeśli nie chcę (celowo) używać Doctrine?
A co jeżeli nie będziesz chciał, albo nie będziesz mógł, używać Symfony??? Nadal uważasz, że przekazywanie kontenera to dobry pomysł.
Kontener powinien zarządzać twoimi obiektami, być ponad nimi w osobnej warstwie, nic więcej.
A jeśli nie jest, w kodzie akcji wywołuję go:
use Alden\xxx\Model\ProductManager;
$m = new ProductManager();
Od tego rodzaju przypadków masz fabryki lub buildery, które już możesz trzymać w kontenerze.
Paweł
Koralewski
starszy programista,
wiem ile nie wiem
Temat: [Sf2] odpowiednik sfConfig
Alan Gabriel B.:
Paweł, szukasz dziury w całym. Przyjmij po prostu jako rule of thumb, że przekazywanie kontenera do modelu jest zwyczajnie złym pomysłem.
Przekazywanie kontenera do modelu to nie ja wymyśliłem :) Ani nie sugerowałem. Natomiast posiłkując się radami zawartymi w tym wątku, zamierzam korzystać z dwóch rozwiązań, zależnie od potrzeb:
1. zebrać funkcjonalności i utworzyć usługę
2. do konstruktora modelu przekazać potrzebne parametryPaweł Koralewski edytował(a) ten post dnia 07.11.11 o godzinie 23:53
