ਤੁਹਾਡਾ Controller ਗਲਤ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ

ਆਪਣਾ controller ਖੋਲ੍ਹੋ। ਇੱਕ store method ਲੱਭੋ।

ਕੀ ਇਸ ਵਿੱਚ 40 ਲਾਈਨਾਂ ਦਾ ਕੋਡ ਹੈ? ਕੀ ਤੁਹਾਨੂੰ ਇੱਕ ਵੱਡਾ validation block, ਕਈ if statements, business logic, ਅਤੇ ਫਿਰ ਇੱਕ return statement ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ?

ਤੁਹਾਡਾ controller ਉਹ ਕੰਮ ਕਰ ਰਿਹਾ ਹੈ ਜੋ ਉਸਨੂੰ ਨਹੀਂ ਕਰਨਾ ਚਾਹੀਦਾ।

ਇੱਕ controller ਦਾ ਇੱਕ ਹੀ ਕੰਮ ਹੁੰਦਾ ਹੈ। ਇਹ ਇੱਕ request ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ, ਸਮੱਸਿਆ ਨੂੰ ਹੱਲ ਕਰਨ ਲਈ ਇੱਕ service ਨੂੰ ਕਾਲ ਕਰਦਾ ਹੈ, ਅਤੇ ਇੱਕ response ਵਾਪਸ ਕਰਦਾ ਹੈ। ਇਹ ਵੇਟਰ (waiter) ਹੈ, ਸ਼ੈੱਫ (chef) ਨਹੀਂ।

ਜਦੋਂ ਤੁਸੀਂ controller ਦੇ ਅੰਦਰ validation ਅਤੇ authorization ਪਾਉਂਦੇ ਹੋ, ਤਾਂ ਇਹ ਇੱਕ ਖਿਲਾਰਾ (mess) ਬਣ ਜਾਂਦਾ ਹੈ। ਤੁਹਾਡੇ ਕੋਲ 80 ਲਾਈਨਾਂ ਦਾ ਕੋਡ ਰਹਿ ਜਾਂਦਾ ਹੈ ਜਿਸ ਨੂੰ ਕੋਈ ਵੀ ਛੂਹਣਾ ਨਹੀਂ ਚਾਹੁੰਦਾ।

Laravel ਕੋਲ ਇੱਕ built-in ਹੱਲ ਹੈ: Form Requests।

ਇੱਕ ਆਮ ਗਲਤ pattern ਇਸ ਤਰ੍ਹਾਂ ਦਿਖਾਈ ਦਿੰਦਾ ਹੈ:

  • input data ਨੂੰ validate ਕਰਨਾ
  • user permissions ਦੀ ਜਾਂਚ ਕਰਨਾ
  • data ਨੂੰ transform ਕਰਨਾ
  • business logic ਚਲਾਉਣਾ

ਇਹ Single Responsibility Principle ਨੂੰ ਤੋੜਦਾ ਹੈ। ਇੱਕ class ਦੇ ਬਦਲਣ ਦਾ ਸਿਰਫ਼ ਇੱਕ ਹੀ ਕਾਰਨ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ। ਇੱਕ controller ਉਦੋਂ ਬਦਲਦਾ ਹੈ ਜਦੋਂ request flow ਬਦਲਦਾ ਹੈ। ਇਸਨੂੰ ਸਿਰਫ਼ ਇਸ ਲਈ ਨਹੀਂ ਬਦਲਣਾ ਚਾਹੀਦਾ ਕਿਉਂਕਿ ਇੱਕ validation rule ਬਦਲ ਗਿਆ ਹੈ।

ਇਸਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਇਸ command ਦੀ ਵਰਤੋਂ ਕਰੋ: php artisan make:request StorePostRequest

ਇਹ ਤੁਹਾਡੇ request logic ਲਈ ਇੱਕ ਸਮਰਪਿਤ (dedicated) ਫਾਈਲ ਬਣਾਉਂਦਾ ਹੈ। ਇਹਨਾਂ ਤਿੰਨ ਚੀਜ਼ਾਂ ਨੂੰ Form Request ਵਿੱਚ ਮੂਵ ਕਰੋ:

  • Authorization: permissions ਦੀ ਜਾਂਚ ਕਰਨ ਲਈ authorize() method ਦੀ ਵਰਤੋਂ ਕਰੋ।
  • Validation: ਆਪਣੀਆਂ data requirements ਨੂੰ ਪਰਿਭਾਸ਼ਿਤ ਕਰਨ ਲਈ rules() method ਦੀ ਵਰਤੋਂ ਕਰੋ।
  • Data Preparation: validation ਤੋਂ ਪਹਿਲਾਂ data ਨੂੰ ਸਾਫ਼ ਕਰਨ ਜਾਂ format ਕਰਨ ਲਈ prepareForValidation() ਦੀ ਵਰਤੋਂ ਕਰੋ।

ਹੁਣ ਆਪਣੇ controller ਨੂੰ ਦੁਬਾਰਾ ਦੇਖੋ:

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

Controller ਹੁਣ ਸਿਰਫ਼ ਦੋ ਲਾਈਨਾਂ ਦਾ ਰਹਿ ਗਿਆ ਹੈ। ਇਹ ਫਿਰ ਤੋਂ ਇੱਕ ਵੇਟਰ ਵਾਂਗ ਕੰਮ ਕਰਦਾ ਹੈ।

Laravel controller method ਸ਼ੁਰੂ ਹੋਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਆਪਣੇ ਆਪ authorization ਅਤੇ validation ਚਲਾ ਦਿੰਦਾ ਹੈ। ਜੇਕਰ validation ਫੇਲ ਹੋ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਉਪਭੋਗਤਾ (user) ਨੂੰ ਤੁਰੰਤ ਇੱਕ error ਮਿਲ ਜਾਂਦਾ ਹੈ।

ਇਹਨਾਂ ਦਿਸ਼ਾ-ਨਿਰਦੇਸ਼ਾਂ (guidelines) ਦੀ ਪਾਲਣਾ ਕਰੋ:

  • ਜੇਕਰ validation ਛੋਟੀ ਹੈ ਅਤੇ ਸਿਰਫ਼ ਇੱਕ ਹੀ ਜਗ੍ਹਾ ਵਰਤੀ ਜਾਂਦੀ ਹੈ, ਤਾਂ ਇਸਨੂੰ inline ਰੱਖੋ।
  • ਜੇਕਰ validation ਵਧਦੀ ਹੈ, ਦੁਹਰਾਉਂਦੀ ਹੈ, ਜਾਂ ਇਸ ਵਿੱਚ authorization ਸ਼ਾਮਲ ਹੈ, ਤਾਂ Form Request ਦੀ ਵਰਤੋਂ ਕਰੋ।
  • Form Request ਵਿੱਚ business logic ਨਾ ਪਾਓ। ਉਸਦੇ ਲਈ Service layer ਦੀ ਵਰਤੋਂ ਕਰੋ।

ਅੱਜ ਹੀ ਆਪਣੇ ਸਭ ਤੋਂ ਵੱਧ ਖਿਲਾਰੇ ਵਾਲੇ controller ਨੂੰ ਲੱਭੋ। Validation ਨੂੰ Form Request ਵਿੱਚ ਕੱਢੋ (extract ਕਰੋ)। ਦੇਖੋ ਕਿ ਇਹ ਕਿਵੇਂ ਛੋਟਾ ਹੋ ਜਾਂਦਾ ਹੈ।

ਤੁਸੀਂ ਹੁਣ ਤੱਕ ਦਾ ਸਭ ਤੋਂ ਵੱਡਾ store method ਕਿਹੜਾ ਦੇਖਿਆ ਹੈ? ਮੈਨੂੰ comment ਵਿੱਚ ਦੱਸੋ।

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