[2.0] Obsluga wyjatkow

Witam,

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ł.

http://www.yiiframework.com/doc-2.0/yii-web-erroraction.html

W konfiguracji ustawiłem jak należy i mam 98% pewność, że konfiguracja jest zaczytywana gdyż widzę delikatne zmiany gdy wprowadzam tam zmiany




'errorHandler' => [

            'errorAction' => 'strona/error',

			'maxSourceLines' => 15,

        ],



A tutaj akcja na ktora probuje cokolwiek przekierowac:




'errorHandler' => [

            //'errorAction' => '/strona/error',

            'errorAction' => 'strona/error',

			'maxSourceLines' => 15,

        ],



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.

Jakieś sugestie, pomysły ?

EDIT:

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';

}

}



Dodaj do modelu walidator, który będzie sprawdzał czy klucz jest unikalny. Rozwiązujemy problem, zamiast tylko go maskować.

Słuszna uwaga.

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.