Ja dalej wojuję z Yii 2.0 Teraz przeskoczyć nie mogę tematu obsługi wyjątków. Mianowicie wyrzuca mi: Integrity constraint violation - poniewaz duplicat klucza i znam przyczynę. Chciałbym tak obsłuzyć ten wyjątek aby nie wyświetlał mi całej strony z błędem a jedynie to na co ja miałbym ochotę. Czyli drobny komunikat z bledem dla uzytkownika i przekierowanie na inna stronę. No ale…
Dotarłem do dokumentacji gdzie jest opisane, że można skonfigurować komponent errorHandler nadając mu errorAction dzięki czemu błąd zostałby skierowany na konkretny kontroler i jego akcję. Niestety. Coś mi nie wychodzi jakbym chciał.
Dodam może, że model jest ActiveRecord i tutaj występuje duplikat ID. Kombinowałem aby w kontrolerze, który wywołuje save() wstawić blok try{} catch(){} jednak Yii omija to i stosuje wlasne mechanizmy.
Rozwiązaniem jakie udało mi się stworzyć jest blok try{} catch(){}. Myślę, że nie jest to złe rozwiązanie aczkolwiek można pewnie zrobić to lepiej.
W pliku kontrolera, który wywołuje mi felarny save() dodałem kilka zmian i działa.
Wygląda to mniejwięcej tak:
use yii\db\IntegrityException;
public function actionZlaFunkcja(){
try{
$urzadzenie->save();
}
catch (IntegrityException $e){
echo 'denerwujacy i irytujacy blad przez ktory powstal watek';
}
}
Zmodyfikowałem za Twoją radą model. Jednak nic to nie zmieniło. Podejrzewam, że walidacja jest wykonywana przed metodą beforeSave($insert).
PS. Swoją drogą jest gdzieś opisane co po czym jest wywoływane ?
PPS. Problemem dla walidacji danych unique było to, że pole które potrzebowałem mieć unique było modyfikowane beforeSave($insert); i wygląda na to, że walidacja była wykonywana jeszcze przed tą metodą. Po przerzuceniu paru linijek tworzących docelowe ID do beforeValidate(); wszystko zaczeło pracować zgodnie z założeniami.