Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Laravel] Nie zawsze wyświetla komunikaty po wysłanym POST'cie, prośba o spojrzenie w kod
casperii
post 23.10.2020, 08:21:17
Post #1





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


Panowie dziwna sprawa , albo coś namieszałem w kodzie albo sam nie wiem , po wysłaniu POSTA raz wyświetli komunikat z walidacją a innym razem brak informacji.
Poniżej kod:

web.php

  1. Route::group(['prefix'=>'profile','middleware' => 'isVerified'],function(){
  2. Route::get('/','BackendController@index')->name('profileHome');
  3. Route::match(['GET','POST'],trans('routes.profile'),'BackendController@index')->name('profile');
  4. });
  5.  
  6. Auth::routes(['verify' => true]);



BackendController.php
  1. class BackendController extends Controller
  2. {
  3. public function __construct(BackendGateway $backendGateway, BackendRepositoryInterface $backendRepository)
  4. {
  5.  
  6. $this->middleware( $this->setMiddleware() );
  7.  
  8. $this->bG = $backendGateway;
  9. $this->bR = $backendRepository;
  10. }
  11.  
  12.  
  13. public function index(Request $request)
  14. {
  15.  
  16. if ($request->isMethod('post'))
  17. {
  18. /* to odwołuje się do Gateways/BackendGateway */
  19. $this->bG->saveUserData($request);
  20. Cache::flush();
  21. return redirect()->back()->with('success','Dane zostały zmienione.');
  22. }
  23. return view('backend.index',['user'=>Auth::user()]);
  24. }
  25.  
  26. }
  27.  



BackendGateway.php
  1. class BackendGateway {
  2.  
  3.  
  4. use \Illuminate\Foundation\Validation\ValidatesRequests;
  5.  
  6.  
  7. public function __construct(BackendRepositoryInterface $bR )
  8. {
  9. $this->bR = $bR;
  10. }
  11.  
  12. protected function validatorSaveUserData(array $data)
  13. {
  14. return Validator::make($data, [
  15. 'gender'=>"required",
  16. 'name'=>"required|string|min:3",
  17. 'surname'=>"required|string|min:3",
  18. 'address'=>"required|string|min:5",
  19. 'city'=>"required|string|min:5",
  20. 'postcode'=>"required|integer|min:5",
  21. 'country'=>"required|string|min:2"
  22. ]);
  23. }
  24.  
  25. public function saveUserData($request)
  26. {
  27. $this->validatorSaveUserData($request->all())->validate();
  28. return $this->bR->saveUserData($request);
  29. }
  30.  
  31. }


BackendRepository.php
  1. class BackendRepository implements BackendRepositoryInterface {
  2.  
  3. public function saveUserData($request)
  4. {
  5. $user = User::find($request->user()->id);
  6. $user->gender = $request->input('gender');
  7. $user->name = $request->input('name');
  8. $user->surname = $request->input('surname');
  9. $user->address = $request->input('address');
  10. $user->city = $request->input('city');
  11. $user->postcode = $request->input('postcode');
  12. $user->country = $request->input('country');
  13. $user->save();
  14.  
  15. return $user;
  16. }
  17.  
  18. }


oraz index.blade
  1. @if($errors->any())
  2. <br>
  3. <div class="alert alert-danger">
  4. <ul>
  5. @foreach ($errors->all() as $message)
  6. <li>{{ $message }}</li>
  7. @endforeach
  8. </ul>
  9. </div>
  10. @endif
  11.  
  12. @if ($message = Session::get('success'))
  13. <div class="alert alert-success alert-block">
  14. <button type="button" class="close" data-dismiss="alert"></button>
  15. <strong>{{ $message }}</strong>
  16. </div>
  17. @endif
  18.  
  19. <form {{ $novalidate }} action="{{ route('profile') }}" method="POST">
  20. <div class="col-sm-4 col-md-4">
  21. <div class="form-group">
  22. <label class="form-label" for="imie">Imię</label>
  23. <input type="text" class="form-control" name="name" placeholder="Imię" id="imie" value="{{ $user->name }}" required>
  24. </div>
  25. </div>
  26. <div class="card-footer text-right">
  27. <button type="submit" class="btn btn-primary">Zapisz</button>
  28. </div>
  29. {{ csrf_field() }}
  30. </form>
  31. </form>

Go to the top of the page
+Quote Post
SmokAnalog
post 23.10.2020, 08:50:24
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


1. Jakie tam masz middleware?
2. Co to znaczy "czasami"?
3. Dlaczego używasz tej samej akcji kontrolera dla GET i POST zamiast to oddzielić?
Go to the top of the page
+Quote Post
viking
post 23.10.2020, 09:01:48
Post #3





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


Pewnie się coś krzaczy dla GET który jest walidowany a nie ma parametrów. Pomyślałeś o użyciu https://laravel.com/docs/8.x/validation#for...uest-validation ?


--------------------
Go to the top of the page
+Quote Post
casperii
post 23.10.2020, 10:14:43
Post #4





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


Cytat(SmokAnalog @ 23.10.2020, 09:50:24 ) *
1. Jakie tam masz middleware?
2. Co to znaczy "czasami"?
3. Dlaczego używasz tej samej akcji kontrolera dla GET i POST zamiast to oddzielić?


Ad1 ? Pytasz o to co mam w Kernel.php ?
Ad2. przesyłam puste inputy żeby sprawdzić walidację -> brak message - > Ctrl + F5 - > ponowne przesłanie jest walidacja -> ponowna akcja brak walidacji -> takie w kratkie i nie zależne od niczego pojawia się i znika smile.gif
Ad3. czyli uważasz , żę nie powinienem stosować matcha? tylko rozbić

  1. Route::get(trans('routes.profile'),'BackendController@index')->name('profile');
  2. Route::post(trans('routes.profile'),'BackendController@index')->name('profile');


Jeżeli tak to to za wiele nie wnosi.
Go to the top of the page
+Quote Post
SmokAnalog
post 23.10.2020, 10:26:00
Post #5





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Chodziło mi o rozbicie tak:

  1. Route::get(trans('routes.profile'), 'BackendController@read')->name('profile.read');
  2. Route::post(trans('routes.profile'), 'BackendController@write')->name('profile.write');


Inna metoda kontrolera i inna nazwa, nawet jeśli URL jest taki sam.

Jeśli chodzi o middleware, pytałem jakie konkretnie middleware są odpalane na tych route'ach.
Go to the top of the page
+Quote Post
casperii
post 23.10.2020, 10:52:27
Post #6





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


Cytat(SmokAnalog @ 23.10.2020, 11:26:00 ) *
Chodziło mi o rozbicie tak:

  1. Route::get(trans('routes.profile'), 'BackendController@read')->name('profile.read');
  2. Route::post(trans('routes.profile'), 'BackendController@write')->name('profile.write');


Inna metoda kontrolera i inna nazwa, nawet jeśli URL jest taki sam.

Jeśli chodzi o middleware, pytałem jakie konkretnie middleware są odpalane na tych route'ach.



lista routów:


rozbicie też nie przyniosło rezultatu.

Ten post edytował casperii 23.10.2020, 10:53:27
Go to the top of the page
+Quote Post
SmokAnalog
post 23.10.2020, 10:59:05
Post #7





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Rozbicie nie miało "przynieść efektu", tylko poprawić architekturę.

Usuń Cashe::flush() , a zamiast redirect back zrób redirect do jakiegoś konkretnego route'a, bo chyba o to Ci chodzi.
Go to the top of the page
+Quote Post
casperii
post 23.10.2020, 12:57:23
Post #8





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


Cytat(SmokAnalog @ 23.10.2020, 11:59:05 ) *
Rozbicie nie miało "przynieść efektu", tylko poprawić architekturę.

Usuń Cashe::flush() , a zamiast redirect back zrób redirect do jakiegoś konkretnego route'a, bo chyba o to Ci chodzi.


Niestety nadal to samo, powtórzę cel jaki chcę osiągnąć. Wchodząc w route profile :
  1. Route::get(trans('routes.profile'),'BackendController@index')->name('profile');


mam formularz m.in imie, nazwisko , po kliknięciu zapisz , następuje aktualizacja (to się zapisuje bez problemu) , teraz gdybym pominął jedno z tych pól ma walić walidacja na roucie "profile" , niestety nadal są jakieś jaja bo raz jest raz nie ma tego komunikatu, a teraz to już w ogóle nie ma tego komunikatu sad.gif , roout na obsłużenie tego action post:

  1. Route::post(trans('routes.profile'),'BackendController@profile')->name('EditUserData');
Go to the top of the page
+Quote Post
netir
post 23.10.2020, 13:39:05
Post #9





Grupa: Zarejestrowani
Postów: 44
Pomógł: 5
Dołączył: 20.05.2019

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


Dlaczego nie korzystasz z walidacji tak jak proponuje Laravel? Według mnie przekombinowałeś, proponuje tak:

1. Zrób custom Request do walidacji forma - https://laravel.com/docs/8.x/validation#cre...g-form-requests (niezależnie od wersji, praktycznie to samo) i usuń BackendGateway, zamiast tego DI do metod bezpośrednio.
2. Rozbij obecny index na metody index oraz store
3. Zamiast matcha zrób po prostu
  1. Route::resource('nazwa_routa', BackendController::class)->only(['index', 'store'])

4. To co masz w Repository, zmienne przypisywane z requestu, lepiej pobrać tak:
  1. $request->validated()
, mniej kodu i masz pewność, że pola sa po walidacji. Dodatkowo nie rozumiem po co zrobiłeś
  1. $user = User::find($request->user()->id);
, skoro samo $request->user() daje Ci dokładnie to co szukasz lub po prostu możesz zrobić
  1. Auth::user()


Go to the top of the page
+Quote Post
casperii
post 23.10.2020, 14:14:06
Post #10





Grupa: Zarejestrowani
Postów: 680
Pomógł: 28
Dołączył: 14.08.2014

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


Cytat(netir @ 23.10.2020, 14:39:05 ) *
Dlaczego nie korzystasz z walidacji tak jak proponuje Laravel? Według mnie przekombinowałeś, proponuje tak:

1. Zrób custom Request do walidacji forma - https://laravel.com/docs/8.x/validation#cre...g-form-requests (niezależnie od wersji, praktycznie to samo) i usuń BackendGateway, zamiast tego DI do metod bezpośrednio.
2. Rozbij obecny index na metody index oraz store
3. Zamiast matcha zrób po prostu
  1. Route::resource('nazwa_routa', BackendController::class)->only(['index', 'store'])

4. To co masz w Repository, zmienne przypisywane z requestu, lepiej pobrać tak:
  1. $request->validated()
, mniej kodu i masz pewność, że pola sa po walidacji. Dodatkowo nie rozumiem po co zrobiłeś
  1. $user = User::find($request->user()->id);
, skoro samo $request->user() daje Ci dokładnie to co szukasz lub po prostu możesz zrobić
  1. Auth::user()


Ad4. tu jest zastosowany Model User, ponieważ user może mieć różne uprawnienia (może być moderatorem , administratorem, gościem), może mieć różny formularz edycyjny (firma / os prawna)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 20:28