Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl


Mariner
Napisane: 17.03.2015, 00:56:36





Grupa: Zarejestrowani
Postów: 47
Dołączył: 26.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----

Wybacz to pytanie ale lepiej się upewnić. Jeżeli coś jeszcze mogę doradzić to tak jak polecał kolega wcześniej, żeby zrozumieć lepiej działanie symfony, dobrze jest choć raz prześledzić pracę całego programu. Jeżeli nie masz do zainstaluj xdebug oraz ide którym będziesz mógł debugować skrypty i na bieżąco śledzić czy nawet zatrzymywać pracę programu w dowolnym momencie. Być może na początku wydawać by się to mogło trudną sprawą ale wiedz że wcześniej czy później i tak tego nie unikniesz. Im szybciej się na to zdecydujesz tym lepiej dla Ciebie. Ze swojej strony mogę polecić eclipse z php dev doinstaluj xdebuga, czego nie będziesz wiedział zapytaj na forum. Naprawdę warto. Polecam i pozdrawiam.
  Forum: Przedszkole · Podgląd postu: #1149948 · Odpowiedzi: 18 · Wyświetleń: 1 347

Mariner
Napisane: 17.03.2015, 00:35:42





Grupa: Zarejestrowani
Postów: 47
Dołączył: 26.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----

Cytat(twojastara @ 17.03.2015, 00:29:04 ) *
Recz w tym, że to pierwsza i jedyna funkcja w tej przykładowej aplikacji, że wcześniej zmienna $request nie jest nigdzie manipulowana, więc to tu obiekt $request jest powoływany do ż.


Framework Symfony2 używa Twojego kontrolera w taki mniej więcej sposób:

CODE
$request = new Request();

$request->bind($_POST, $_GET);

$controller = new YourController();

$response = $controller->test1Action($request);


Tylko tak teraz patrzę w Twój kod ale nie widzę tam kontrolera tylko funkcję. Czy u Ciebie kontroler jest obiektem klasy Controller?
  Forum: Przedszkole · Podgląd postu: #1149946 · Odpowiedzi: 18 · Wyświetleń: 1 347

Mariner
Napisane: 17.03.2015, 00:26:00





Grupa: Zarejestrowani
Postów: 47
Dołączył: 26.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----

Obiekty Request w kontrolerach Symfony2 są tak często używane że zdecydowano się uprościć programistom sprawę z ich pozyskiwaniem w kontrolerach. Dlatego jeżeli zadeklarujesz obiekt request w parametrach metody to otrzymasz gotowy obiekt wypełniony danymi. Nie trzeba chyba wyjaśniać że normalnie tak to nie działa.

To nie jest tak że w Symfony konstrukcja new Request() nie jest tożsama jak w php. Obiekty są tworzone tak samo, z tym że obiekt Request w Symfony2, zanim go otrzymasz, w metodzie kontrolera wypełniany jest przez framework danymi z żądania. Tu nie ma żadnej "magii".
  Forum: Przedszkole · Podgląd postu: #1149944 · Odpowiedzi: 18 · Wyświetleń: 1 347

Mariner
Napisane: 16.03.2015, 23:50:01





Grupa: Zarejestrowani
Postów: 47
Dołączył: 26.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----

Cytat(twojastara @ 16.03.2015, 22:49:56 ) *
a dlaczego ma znaczenie co zwraca?

Dla ścisłości
Kod
Error: Call to a member function get() on a non-object
wywala dla lini nr 14.


Ponieważ w następnej linii, właśnie nr. 14, używasz składowej session tak jak obiektu, wywołując na niej metodę get('cart'). Jak zapewne wiesz, nie można wywołać metody na zmiennej która nie przechowuje w sobie obiektu a taka próba kończy się błędem.

Powinieneś wstrzyknąć obiekt klasy Request już gotowy z zewnątrz, dokładnie tak jak w pierwszym przypadku a nie tworzyć go od nowa w konstruktorze ponieważ wtedy będzie pusty i zwracał będzie puste wartości. W drugim przypadku, sposób pozyskiwania obiektu klasy Request sprawia że jest on pusty. Nie możesz oczekiwać że już samo utworzenie obiektu Request sprawi że będzie miał on w sobie dane które może Ci zwrócić.

W systemie Symfony, obiekt Request możesz pozyskać z kontenera $request = $container->get('request'). Jeżeli masz problem z dostępem do obiektu Request w klasie Card, spraw aby obiekty klasy Cart tworzone były jako usługi (services). Przykładowy plik services.xml mógłby wyglądać tak:

CODE
<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/ser...0.xsd">

<services>

<service id="app_utils.card.service" class="\AppBundle\Util\Card">
<argument type="service" id="request"/>
</service>

</services>
</container>


Dzięki temu, w kontrolerach, obiekty klasy Cart możemy pozyskiwać tak $card = $this->get('app_utils.card.service') o ile klasę Card zadeklarujesz jak w pierwszym przykładzie.
A za powoływanie obiektów klasy Card i wstrzykiwanie im obiektu Request martwił będzie się kontener zależności Symfony.

Cytat(twojastara @ 16.03.2015, 23:28:47 ) *
acha,

no tak, Mariner w pierwszej odpowiedzi pisał coś podobnego, (ale zamiast 'w konstruktorze' napisał 'w kontrolerze').


Fakt. Mój błąd, chodziło oczywiście o konstruktor a nie kontroler.
  Forum: Przedszkole · Podgląd postu: #1149938 · Odpowiedzi: 18 · Wyświetleń: 1 347

Mariner
Napisane: 16.03.2015, 20:08:23





Grupa: Zarejestrowani
Postów: 47
Dołączył: 26.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----

Ponieważ $this->request->getSession() nie zwraca obiektu. Sprawdź co zwraca. Jest to związane ze sposobem w jaki przypisywany jest obiekt $request. W pierwszej wersji z zewnątrz, a więc możemy się domyślać że jest zainicjowany i posiada już przypisany obiekt session. W drugim przypadku obiekt Request tworzony jest w kontrolerze a więc nie posiada danych żądania ani session.
  Forum: Przedszkole · Podgląd postu: #1149918 · Odpowiedzi: 18 · Wyświetleń: 1 347

Mariner
Napisane: 23.03.2015, 22:32:55





Grupa: Zarejestrowani
Postów: 47
Dołączył: 26.12.2006
Skąd: Wrocław

Ostrzeżenie: (0%)
-----

Sprawdź sobie czy odpowiada Ci takie działanie kodu, który w przypadku błędu połączenia nie pokazuje ostrzeżenia (warning)

CODE
mysqli_report(MYSQLI_REPORT_ALL);

try {

$database = new mysqli('localhost', 'root', 'password', 'db_name');

} catch(Exception $error) {


}


Albo taka propozycja użycia tego kodu:

CODE

<?php

function database() {

mysqli_report(MYSQLI_REPORT_ALL);

$database = mysqli_connect("localhost", "my_user", "my_password", "world");

return $database;
}

try {
$database = database();
} catch (Exception $e) {
// tutaj obsługujemy błąd połaczenia
// przykładowo wyświetlamy komunikat
echo sprintf ( 'Mysqli connect Error with message : "%s" and Code "%s" ', $e->getMessage(), $e->getCode() );

$database = null; // database ustawiamy na false - czyli brak połączenia, jeżeli będziemy dalej korzystali z niej w naszym skrypcie
}


if($database) { // jeżeli database przechowuje połączenie/nie jest false

if(!$database->set_charset("utf8")) { // prawdź kodowanie

throw new Exception('Błąd wyboru kodowania!');

}

}
  Forum: Przedszkole · Podgląd postu: #1151107 · Odpowiedzi: 55 · Wyświetleń: 1 686


New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 4.05.2024 - 02:02