ನಿಮ್ಮ ಕಂಟ್ರೋಲರ್ ತಪ್ಪು ಕೆಲಸ ಮಾಡುತ್ತಿದೆ

ನಿಮ್ಮ ಕಂಟ್ರೋಲರ್ ಅನ್ನು ತೆರೆಯಿರಿ. ಅಲ್ಲಿರುವ 'store' ಮೆಥಡ್ ಅನ್ನು ಹುಡುಕಿ.

ಅದರಲ್ಲಿ 40 ಸಾಲುಗಳ ಕೋಡ್ ಇದೆಯೇ? ಅಲ್ಲಿ ದೊಡ್ಡ ವ್ಯಾಲಿಡೇಶನ್ ಬ್ಲಾಕ್, ಹಲವಾರು 'if' ಸ್ಟೇಟ್‌ಮೆಂಟ್‌ಗಳು, ಬಿಸಿನೆಸ್ ಲಾಜಿಕ್ ಮತ್ತು ಕೊನೆಯಲ್ಲಿ 'return' ಸ್ಟೇಟ್‌ಮೆಂಟ್ ಕಾಣಿಸುತ್ತಿದೆಯೇ?

ನಿಮ್ಮ ಕಂಟ್ರೋಲರ್ ಮಾಡಬಾರದ ಕೆಲಸವನ್ನು ಮಾಡುತ್ತಿದೆ.

ಕಂಟ್ರೋಲರ್‌ನ ಒಂದು ಕೆಲಸವೊಂದೇ ಇರುತ್ತದೆ. ಅದು ರಿಕ್ವೆಸ್ಟ್ ಅನ್ನು ಸ್ವೀಕರಿಸುತ್ತದೆ, ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸಲು ಸರ್ವಿಸ್ ಅನ್ನು ಕರೆಯುತ್ತದೆ ಮತ್ತು ರೆಸ್ಪಾನ್ಸ್ ಅನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ. ಇದು ವೇಟರ್ ಇದ್ದಂತೆ, ಶೆಫ್ ಅಲ್ಲ.

ನೀವು ಕಂಟ್ರೋಲರ್‌ನ ಒಳಗಡೆ ವ್ಯಾಲಿಡೇಶನ್ ಮತ್ತು ಅಥರೈಸೇಶನ್ ಅನ್ನು ಹಾಕಿದಾಗ, ಅದು ಗೊಂದಲಮಯವಾಗುತ್ತದೆ. ಅಂತಿಮವಾಗಿ ಯಾರೂ ಮುಟ್ಟಲು ಬಯಸದ 80 ಸಾಲುಗಳ ಕೋಡ್ ನಿಮ್ಮ ಕೈಗೆ ಸಿಗುತ್ತದೆ.

Laravel ನಲ್ಲಿ ಇದಕ್ಕೆ ಅಂತರ್ಗತ ಪರಿಹಾರವಿದೆ: Form Requests.

ಒಂದು ಸಾಮಾನ್ಯ ಕೆಟ್ಟ ಮಾದರಿ ಹೀಗಿರುತ್ತದೆ:

  • ಇನ್‌ಪುಟ್ ಡೇಟಾವನ್ನು ವ್ಯಾಲಿಡೇಟ್ ಮಾಡುವುದು
  • ಬಳಕೆದಾರರ ಅನುಮತಿಗಳನ್ನು (permissions) ಪರಿಶೀಲಿಸುವುದು
  • ಡೇಟಾವನ್ನು ಪರಿವರ್ತಿಸುವುದು (Transforming data)
  • ಬಿಸಿನೆಸ್ ಲಾಜಿಕ್ ಅನ್ನು ರನ್ ಮಾಡುವುದು

ಇದು Single Responsibility Principle ಅನ್ನು ಉಲ್ಲಂಘಿಸುತ್ತದೆ. ಒಂದು ಕ್ಲಾಸ್ ಬದಲಾಗಲು ಕೇವಲ ಒಂದು ಕಾರಣವೊಂದೇ ಇರಬೇಕು. ರಿಕ್ವೆಸ್ಟ್ ಫ್ಲೋ ಬದಲಾದಾಗ ಕಂಟ್ರೋಲರ್ ಬದಲಾಗಬೇಕು. ಕೇವಲ ವ್ಯಾಲಿಡೇಶನ್ ರೂಲ್ ಬದಲಾದ ಕಾರಣಕ್ಕೆ ಅದು ಬದಲಾಗಬಾರದು.

ಇದನ್ನು ಸರಿಪಡಿಸಲು ಈ ಕಮಾಂಡ್ ಬಳಸಿ: php artisan make:request StorePostRequest

ಇದು ನಿಮ್ಮ ರಿಕ್ವೆಸ್ಟ್ ಲಾಜಿಕ್ ಗಾಗಿ ಒಂದು ಪ್ರತ್ಯೇಕ ಫೈಲ್ ಅನ್ನು ರಚಿಸುತ್ತದೆ. ಈ ಮೂರು ವಿಷಯಗಳನ್ನು Form Request ಗೆ ವರ್ಗಾಯಿಸಿ:

  • Authorization: ಅನುಮತಿಗಳನ್ನು ಪರಿಶೀಲಿಸಲು authorize() ಮೆಥಡ್ ಬಳಸಿ.
  • Validation: ನಿಮ್ಮ ಡೇಟಾ ಅವಶ್ಯಕತೆಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಲು rules() ಮೆಥಡ್ ಬಳಸಿ.
  • Data Preparation: ವ್ಯಾಲಿಡೇಶನ್ ಮಾಡುವ ಮೊದಲು ಡೇಟಾವನ್ನು ಕ್ಲೀನ್ ಮಾಡಲು ಅಥವಾ ಫಾರ್ಮ್ಯಾಟ್ ಮಾಡಲು prepareForValidation() ಬಳಸಿ.

ಈಗ ನಿಮ್ಮ ಕಂಟ್ರೋಲರ್ ಅನ್ನು ಮತ್ತೊಮ್ಮೆ ನೋಡಿ:

public function store(StorePostRequest $request)
{
    $post = Post::create($request->validated());
    return redirect()->route('posts.show', $post);
}

ಈಗ ಕಂಟ್ರೋಲರ್ ಕೇವಲ ಎರಡು ಸಾಲುಗಳಷ್ಟಿದೆ. ಇದು ಮತ್ತೆ ವೇಟರ್‌ನಂತೆ ಕೆಲಸ ಮಾಡುತ್ತದೆ.

ಕಂಟ್ರೋಲರ್ ಮೆಥಡ್ ಪ್ರಾರಂಭವಾಗುವ ಮೊದಲೇ Laravel ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಥರೈಸೇಶನ್ ಮತ್ತು ವ್ಯಾಲಿಡೇಶನ್ ಅನ್ನು ರನ್ ಮಾಡುತ್ತದೆ. ವ್ಯಾಲಿಡೇಶನ್ ವಿಫಲವಾದರೆ, ಬಳಕೆದಾರರಿಗೆ ತಕ್ಷಣವೇ ಎರರ್ ಸಿಗುತ್ತದೆ.

ಈ ಮಾರ್ಗಸೂಚಿಗಳನ್ನು ಅನುಸರಿಸಿ:

  • ವ್ಯಾಲಿಡೇಶನ್ ಚಿಕ್ಕದಾಗಿದ್ದು, ಕೇವಲ ಒಂದು ಕಡೆ ಮಾತ್ರ ಬಳಕೆಯಾಗುತ್ತಿದ್ದರೆ ಅದನ್ನು ಇನ್‌ಲೈನ್ (inline) ಆಗಿಯೇ ಇರಿಸಿ.
  • ವ್ಯಾಲಿಡೇಶನ್ ಹೆಚ್ಚಾದಾಗ, ಪುನರಾವರ್ತಿತವಾಗಿದ್ದಾಗ ಅಥವಾ ಅಥರೈಸೇಶನ್ ಒಳಗೊಂಡಿದ್ದಾಗ Form Request ಬಳಸಿ.
  • Form Request ನಲ್ಲಿ ಬಿಸಿನೆಸ್ ಲಾಜಿಕ್ ಅನ್ನು ಹಾಕಬೇಡಿ. ಅದಕ್ಕಾಗಿ Service layer ಬಳಸಿ.

ಇಂದು ನಿಮ್ಮ ಅತ್ಯಂತ ಗೊಂದಲಮಯವಾದ ಕಂಟ್ರೋಲರ್ ಅನ್ನು ಹುಡುಕಿ. ವ್ಯಾಲಿಡೇಶನ್ ಅನ್ನು Form Request ಗೆ ವರ್ಗಾಯಿಸಿ. ಅದು ಹೇಗೆ ಚಿಕ್ಕದಾಗುತ್ತದೆ ಎಂದು ನೋಡಿ.

ನೀವು ನೋಡಿದ ಅತ್ಯಂತ ದೊಡ್ಡ 'store' ಮೆಥಡ್ ಯಾವುದು? ಕಾಮೆಂಟ್‌ನಲ್ಲಿ ತಿಳಿಸಿ.

Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o