@uirapuru: no widzisz kazdy ma w sobie doze naiwnosci ale jesli widze goscia ktory od lat codziennie wstawia top linki z IT to mu najnormalniej ufam bo wzbogaca mnie, widze ich codzienna dobra robota i mysle ze wykop powinien im wyplacac dolany i to ciezkie
@normanos:

User

pubf articles(){

return $this->hasMany('Article');

}

pubf comments(){

return $this->hasMany('Comment');

}

Comment

pubf user(){

return $this->belongsTo('User');

}

pubf article(){

return $this->belongsTo('Article');

}

Article

pubf user(){

return $this->belongsTo('User');

}

pubf comments(){

return $this->hasMany('Comment');

}

W skrócie tak to jest. I teraz jak chcę wczytać komentarze, lub filmy to robię to tak:

$comments = Comments::where('user_id', '=', $id)->paginate(15);
@kot1401: Testowalne jedynie funkcjonalnie – tzn, żeby móc przetestować swój kod musisz mieć pewność, że klasa

App
działa poprawnie.

Do testowania jednostkowo: wstrzykuj.

Do uniezależnienia się od frameworka: wstrzykuj.

Do pisania czystego kodu olej pseudo–fasadki z frameworka na L.
@kot1401: Masz dwa wyjścia:

1. Przekazać wartości pól z obu modeli w jednej tablicy (wtedy reguła ograniczy się do prostego porównania bo będziesz mieć wszystkie dane w parametrze).

Lub:

2. Stworzyć regułę na wzór exists, w której podasz identyfikator rekordu modelu B, z którego powinny zostać pobrane wartości pól. Pobieranie danych robisz wewnątrz reguły, przed porównaniem.
Miałbym do Was kilka pytań o architekturę bardziej zaawansowanej aplikacji w Laravel.

Obecnie mój projekt obfituje dziesiątki antywzorców, takich jak trzymanie logiki i walidacji danych w kontrolerze, brak obiektowości itd. itp.

Chciałbym to wszystko jak najszybciej zrefaktoryzować do wzorca "Repository Pattern".

Co prawda, w internecie jest mnóstwo artykułów na temat Repository Pattern w Laravelu, ale każdy różni się nieco od pozostałych, brakuje też jakichś bardziej zaawansowanych przykładów.

Stworzyłem 3 repozytoria, pobierające dane
@kot1401: Zamiast pytać jak pisać klasy – zacznij pisać testy (jednostkowe).

Dlaczego? Bo wiele rzeczy TDD wymusza, które są pozytywne z architektonicznego punktu widzenia.

Np:

* W środku metody

buy()
robisz odwołanie do

Config::get()
– miałbyś bardzo ciężkie życie, żeby to przetestować i natychmiast zacząłbyś konfigurację wstrzykiwać (np w konstruktorze) – tym samym spełniłbyś http://en.wikipedia.org/wiki/Inversion_of_control

* Zastanawiasz się czy zrobić jedną czy trzy klasy? Testując zobaczyłbyś jak realnie dużo robi już
Mirki, pomóżcie. Zacząłem przygodę z Laravelem 4. Tworzę sobie bazę danych za pomocą Schema Builder. Zrobiłem co chciałem i mam ją zmigrować. Tu pojawia się problem, otóż wpisując php artisan migrate odmawia mi dostępu do bazy. Dlaczego? Dodam, że robię to na localhost, a env artisan ustawiony jest na production. Jak zmienić, co zrobić? Jak żyć?

#laravel
Pomocy! Potrzebuję podpiąć Auth laravela do istniejącej bazy danych (inne hashe, inne pola z hasłami, itd.).

Reszta bez zmian - muszę znaleźć sposób na wprowadzenie własnego validateCredentials(), które waliduje dane, czyli prawdopodobnie muszę napisać swój własny Auth Driver (implementującą UserProviderInterface)

Sprawa nie wygląda na trudną, ale póki co spędza mi sen z powiek - ciągle coś nie śmiga. Czy znacie może jakiś tutorial, albo gotową bibliotekę, gdzie będę mógł podejrzeć jak to
Dług technologiczny wybranych projektów w #php - jak widać z #laravel wcale nie jest tak źle jak to hejterzy opisują ;), za to taka #joomla czy #wordpress to biją rekordy ;)

--

Podejrzewam, że zaraz padnie pytanie "jak to jest liczone" -> każde naruszenie jakości kodu ma przypisywaną jakąś estymacje czasową, a te dane to po prostu suma. ("each code quality violation detected by SensioLabsInsight gets an estimated cost to fix it.
Pobierz normanos - Dług technologiczny wybranych projektów w #php - jak widać z #laravel wcal...
źródło: comment_S8kTNgbRPCsv5yvZIrprzFGgJqglSIr4.jpg
Mam takiego helpera:

function flight_duration($speed, $distance)

{//Obliczamy czas lotu

if(! is_int($distance) OR ! is_int($speed)) throw new InvalidArgumentException;

$cruise_duration = round($distance / ($speed / 3600));//Przelot na wys. przelotowej

$departure_duration = 1200;//Start i wznoszenie zajmują dodatkowy czas

$landing_duration = 1200;//lądowanie też...

return $departure_duration + $cruise_duration + $landing_duration; //w sekundach

}

Chciałbym zrefaktoryzować ten spaghetti code i przenieść zmienne $departureduration i $landing_duration do jakiegoś pliku konfiguracyjnego (np. config/game.php)

Teraz pytanie, jak się odwoływać do dwóch
Taaadaam, oto mój pierwszy test jednostkowy w życiu:

class GreatCircleDistanceTest extends TestCase {

public function testDistance()

{

$this->assertEquals(1470, great_circle_distance('52.16583252', '20.96722221', '51.47083282', '-0.46055600'));

}

}

Działa!

Powiedzcie mi tylko, czy tak to powinno się robić, czy może coś robię w zły sposób?

Funkcję greatcircledistance() umieściłem w pliku app/helpers.php, a powyższy kod w app/tests/GreatCircleDistanceTest.php

Testuję tutaj, czy odległość z Warszawy do Frankfurtu wynosi 1470 km.

#laravel #php #webdev #unittest #phpunit
Mam w Laravelu dwa modele: User i Car

Car może być stworzony (kupiony) tylko jeśli user ma wystrarczającą ilość gotówki, czyli:

if($user->money - $car->price >= 0) {

//user ma wystarczającą ilość gotówki

}else{

//brak gotówki na ten samochod

}

Teraz pytanie: powyższa reguła powinna być umieszczona w validate modelu Car, czy w kontrolerze CarsController@store?

#laravel #php
@kot1401: Kontroler – odpowiada za komunikację między protokołem HTTP, a modelem aplikacji – tutaj bierzesz sobie GETy/POSTy/sesje/ciastka/itp i przekazujesz je dalej. Nic wiecej.

Entity\Car
– tutaj masz reprezentację samochodu. Przechowuje ona stan i raczej jest powiązana z bazą danych – nie ładowałbym logiki biznesowej (chyba, że robisz #ddd, ale wątpię, więc nie będę Ci mieszać).

Warstwa usług – tutaj ładujesz logikę biznesową. Czyli robisz sobie klasy dedykowane pod zadanie i