<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shahariar Ikbal</title>
    <description>The latest articles on DEV Community by Shahariar Ikbal (@shahariar_ikbal).</description>
    <link>https://dev.to/shahariar_ikbal</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2065173%2Ff1824ebd-0041-41e7-943a-6afff542717e.png</url>
      <title>DEV Community: Shahariar Ikbal</title>
      <link>https://dev.to/shahariar_ikbal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shahariar_ikbal"/>
    <language>en</language>
    <item>
      <title>"সব কোড তো Controller এ লিখেই কাজ করানো যায়" তাহলে কেনো আমরা Service অথবা Repository Design Pattern ব্যবহার করব ?</title>
      <dc:creator>Shahariar Ikbal</dc:creator>
      <pubDate>Wed, 09 Apr 2025 18:23:03 +0000</pubDate>
      <link>https://dev.to/shahariar_ikbal/sb-kodd-to-controller-e-likhei-kaaj-kraano-yaayy-taahle-keno-aamraa-service-athbaa-repository-design-pattern-4j1j</link>
      <guid>https://dev.to/shahariar_ikbal/sb-kodd-to-controller-e-likhei-kaaj-kraano-yaayy-taahle-keno-aamraa-service-athbaa-repository-design-pattern-4j1j</guid>
      <description>&lt;p&gt;প্রশ্নটা অনেক ভালো, এবং এটা সত্যিই একজন ওয়েব ডেভেলপারের ক্যারিয়ারে অনেক গুরুত্বপূর্ণ &lt;br&gt;
১ম এ ছোট করে উত্তর দেই তারপরে এর বিস্তারিত বলার চেষ্টা করব।&lt;br&gt;
&lt;strong&gt;Service অথবা Repository Design Pattern&lt;/strong&gt; ব্যবহার করব এই কারণে, আমার কোড মেইনটেইনেবল এবং রি-ইউজেবল করার জন্য। এখন আসি বিস্তারিত,&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;১. Separation of Concerns (SoC):&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Service বা Repository ব্যবহার করলে কোডকে বিভিন্ন ভাগে ভাগ করে ফেলা যায়।&lt;br&gt;
Controller: শুধুমাত্র HTTP request/response হ্যান্ডল করে।&lt;br&gt;
Service: business logic পরিচালনা করে।&lt;br&gt;
Repository: ডাটাবেজ সম্পর্কিত কাজ করে।&lt;br&gt;
এতে করে কোড ক্লিন হয় এবং সহজে বোঝা যায় কে কোন কাজটা করছে।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;২. কোড পুনঃব্যবহারযোগ্যতা (Reusability):&lt;/strong&gt;&lt;br&gt;
Service বা Repository যখন আলাদা করে লিখা হয়, তখন সেই ফাংশন বা ক্লাস অন্য Controller, Job, Event, বা API-তে পুনরায় ব্যবহার করতে পারা যায়।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৩. Maintainability ও Scalability:&lt;/strong&gt;&lt;br&gt;
ধরেন, আপনার প্রজেক্ট বড় হচ্ছে—নতুন ফিচার যোগ হচ্ছে বা পুরাতন লজিক আপডেট করতে হচ্ছে। যদি সব কিছু Controller-এ থাকে, তখন সেটা খুঁজে পেতে এবং বুঝে কোড আপডেট করা খুব কঠিন হয়ে যায়।&lt;br&gt;
কিন্তু যদি Service/Repository ব্যবহার করা হয়, তাহলে সহজে ওই অংশটা আলাদা করতে পারা যায় এবং পরিবর্তন করতে পারা যায় ।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৪. Unit Testing সহজ হয়:&lt;/strong&gt;&lt;br&gt;
Controller-এ সব কোড রাখলে সেটা টেস্ট করা কঠিন, কারণ এতে অনেক dependency থাকে।&lt;br&gt;
কিন্তু Service বা Repository আলাদা থাকলে আপনি Mock বা Fake দিয়ে সহজেই আলাদা অংশগুলো টেস্ট করতে পারবেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;৫. SOLID Principles অনুসরণ করা সহজ:&lt;/strong&gt;&lt;br&gt;
Service অথবা Repository pattern ব্যবহার করলে আপনি সহজেই SOLID principles (যেমন Single Responsibility Principle, Dependency Inversion Principle ইত্যাদি) ফলো করতে পারবেন।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Without Pattern (সব Controller-এ):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public function store(Request $request)
{
    $validated = $request-&amp;gt;validate([...]);

    $user = User::create([
        'name' =&amp;gt; $validated['name'],
        'email' =&amp;gt; $validated['email'],
        'password' =&amp;gt; bcrypt($validated['password']),
    ]);

    Mail::to($user-&amp;gt;email)-&amp;gt;send(new WelcomeMail($user));

    return response()-&amp;gt;json(['message' =&amp;gt; 'User created']);
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With Service Pattern:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Controller
public function store(UserRegisterRequest $request)
{
    $user = $this-&amp;gt;userService-&amp;gt;register($request-&amp;gt;validated());

    return response()-&amp;gt;json(['message' =&amp;gt; 'User created']);
}

// UserService.php
public function register(array $data)
{
    $user = $this-&amp;gt;userRepository-&amp;gt;create($data);

    Mail::to($user-&amp;gt;email)-&amp;gt;send(new WelcomeMail($user));

    return $user;
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Service or Repository use করলে কি application slow হয়ে যায়?
&lt;/h2&gt;

&lt;p&gt;সংক্ষেপে উত্তর: না, Service বা Repository Design Pattern ব্যবহার করলে application slow হয়ে যায় না।&lt;/p&gt;

&lt;p&gt;Service এবং Repository design pattern হলো code organization techniques, অর্থাৎ কোডকে সুন্দর ও পর্যায়ক্রমে সাজিয়ে লেখার পদ্ধতি। এগুলো শুধুমাত্র আপনার কোডের structure পরিবর্তন করে, execution flow বা performance নয়।&lt;/p&gt;

&lt;p&gt;Laravel বা PHP এর মতো interpreted language-এ method/function call করা বা একটা class থেকে অন্য class invoke করা খুবই দ্রুত এবং lightweight। অতিরিক্ত কোনো DB query, HTTP request, বা বড় লজিক না থাকলে এর performance-এ প্রায় কোনো পার্থক্য হয় না।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;যখন performance আসলেই slow হতে পারে:&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;Unnecessary Abstraction:&lt;/em&gt;&lt;br&gt;
অনেক ছোট জিনিসের জন্য আলাদা Repository বা Service করে ফেললে call stack unnecessarily বড় হয়ে যায়। এটা তেমন খারাপ না, তবে over-engineering করলে project complexity বাড়ে।&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inefficient Logic inside Repository/Service:&lt;/em&gt;&lt;br&gt;
যদি আপনি Repository-তে অনেক ভারী query বা loop লিখেন, তাহলে naturally performance কমবে, কিন্তু সেটা pattern এর দোষ না—logic-এর সমস্যা।&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caching না থাকা:&lt;/em&gt;&lt;br&gt;
যদি আপনি repeatable বা static ডেটা সার্ভ করতে গিয়ে প্রতিবার DB hit করেন, তাহলে performance কমবে—যেটা আপনি caching দিয়ে ঠিক করতে পারবেন (যেমন Redis, Laravel Cache ইত্যাদি)।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;শেষ কথা হলো এই যে:&lt;/strong&gt;&lt;br&gt;
আপনি যতদিন ছোট প্রজেক্ট নিয়ে কাজ করবেন, Controller-এ কোড রেখে কাজ করতে পারবেন।&lt;br&gt;
কিন্তু যতই প্রজেক্ট বড় হবে, ততই কোডের জটিলতা বাড়বে। তখন Service এবং Repository pattern আপনার কোডকে Clean, Maintainable, এবং Testable রাখতে অনেক সাহায্য করবে।&lt;/p&gt;

&lt;p&gt;Service এবং Repository Pattern পারফর্মেন্স কমায় না বরং&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;কোড clean করে,&lt;/li&gt;
&lt;li&gt;মেইনটেইন করা সহজ করে,&lt;/li&gt;
&lt;li&gt;টেস্টিং সুবিধা দেয়।&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;তবে structure/design করতে গিয়ে over-complication না করাই ভালো। ছোট প্রজেক্টে খুব বেশি abstraction দরকার হয় না। কিন্তু scalable system বানাতে গেলে এগুলো অপরিহার্য।&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;জাযাকাল্লাহ&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;&lt;em&gt;আপনাদের মতামত আসা করছি।&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>পিএইচপি</category>
    </item>
    <item>
      <title>github CI/CD Pipeline with Laravel</title>
      <dc:creator>Shahariar Ikbal</dc:creator>
      <pubDate>Thu, 12 Sep 2024 19:57:02 +0000</pubDate>
      <link>https://dev.to/shahariar_ikbal/github-cicd-pipeline-with-laravel-49ib</link>
      <guid>https://dev.to/shahariar_ikbal/github-cicd-pipeline-with-laravel-49ib</guid>
      <description>&lt;p&gt;এটা আমার ১ম পোষ্ট তাই অনেক কিছুই গুছানো কথা হয়ত পাবেন না, তবে আমি যেভাবে কাজ করেছি বা করছি ঠিক সে ভাবেই বলার চেষ্টা করব ইনশাআল্লাহ।&lt;br&gt;
সাধারণত বাংলায় তেমন কোন ভালো পোষ্ট না পেয়ে ভাবলাম আমি যেভাবে CI/CD ব্যবহার করে লারাভেল সাইট cPanel এ ডেপলয় করতেছি এবং করি সেটা একটা পোষ্ট হিসেবে থাকলে, আমার নিজেরও পরে কাজে লাগবে এবং অনেকে ভাইয়ের উপকারেও আসতে পারে। তো চলুন আমরা মেইন কাজে চলে যাই।&lt;/p&gt;

&lt;p&gt;শুরুতেই আমাদের কে cPanel এ লগইন করতে হবে, এবং FTP Accounts মেনুতে যেতে হবে। ওখানে যাওয়ার পরে আমাদের কে একটা FTP Account খুলতে হবে। এবং সেখানে যদি Successful ভাবে Account create হয়ে যায় তাহলে নিচের ছবির মত দেখতে পাওয়া যাবে। &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95f4regz5zaf3zfe99eh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95f4regz5zaf3zfe99eh.png" alt="Image description" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9lcq8xaazrphlw7cfy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9lcq8xaazrphlw7cfy3.png" alt="Image description" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4wx3pilz3f1x4asbx5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs4wx3pilz3f1x4asbx5e.png" alt="Image description" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;অ্যাকাউন্ট ক্রিয়েট হয়ে গেলে username, server, port save করে রাখুন এ গুলো একটু পরেই কাজে লাগবে।&lt;br&gt;
এর পরেই আপনি ডাটাবেজ ক্রিয়েট করে নেন, আপনি ডেভেলপার হলে অবশ্যই এটা জানেন, তাই এটা দেখানো হলো না।&lt;/p&gt;

&lt;p&gt;এর পরেই আপনি github login করুন, এবং আপনার প্রোজেক্ট এর রিপসিটরি তে জান।&lt;br&gt;
এবং নিচের ছবির মত কাজ করুন।&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3a7fillo1ucd5ekqk4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb3a7fillo1ucd5ekqk4e.png" alt="Image description" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj4g7vkvoqijw9emmoc2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbj4g7vkvoqijw9emmoc2.png" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;br&gt;
এর পরেই আপনি Action menu তে চলে জান, এবং নিচের মত একটা ইন্টারফেস দেখতে পাবেন, এখানে থেকে &lt;code&gt;set up a workflow yourself&lt;/code&gt; এখানে ক্লিক করুন এর পরেই আপনাকে বলবে yml এ Logic লিখুন। নিচের ফাইলটা কপি পেস্ট করে, ডাটাবেজ নাম, ইউসার নাম, পাসওয়ার্ড আপনার গুলো দিন।&lt;br&gt;
`name: Laravel CI/CD&lt;br&gt;
on:&lt;br&gt;
  push:&lt;br&gt;
    branches: [ master ]&lt;br&gt;
  pull_request:&lt;br&gt;
    branches: [ master ]&lt;/p&gt;

&lt;p&gt;jobs:&lt;br&gt;
  web-deploy:&lt;br&gt;
    name: Deploying&lt;br&gt;
    runs-on: ubuntu-latest&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  mysql:
    image: mysql:5.7
    ports:
      - 3306:3306
    env:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: dbname
      MYSQL_USER: username
      MYSQL_PASSWORD: password
    options: '--health-cmd="mysqladmin ping --silent" --health-interval=10s --health-timeout=5s --health-retries=3'

steps:
  - uses: actions/checkout@v2.3.2

  - name: Setup PHP
    uses: shivammathur/setup-php@15c43e89cdef867065b0213be354c2841860869e
    with:
      php-version: '8.1.21'

  - name: Copy .env
    run: php -r "file_exists('.env') || copy('.env.example', '.env');"

  - name: Update .env for CI environment
    run: |
      sed -i 's/^DB_CONNECTION=.*/DB_CONNECTION=mysql/' .env
      sed -i 's/^DB_HOST=.*/DB_HOST=127.0.0.1/' .env
      sed -i 's/^DB_PORT=.*/DB_PORT=3306/' .env
      sed -i 's/^DB_DATABASE=.*/DB_DATABASE=dbname/' .env
      sed -i 's/^DB_USERNAME=.*/DB_USERNAME=username/' .env
      sed -i 's/^DB_PASSWORD=.*/DB_PASSWORD=password/' .env

  - name: Install Dependencies
    run: composer install --ignore-platform-reqs

  - name: Generate key
    run: php artisan key:generate

  - name: Wait for MySQL to be ready
    run: |
      until mysqladmin ping --host=127.0.0.1 --user=username --password=password --silent; do
        echo "Waiting for database connection..."
        sleep 5
      done

  - name: Test Database Connection
    run: php -r "new PDO('mysql:host=127.0.0.1;dbname=dbname', 'username', 'password');"

  - name: Rollback Migrations and Seed
    run: php artisan migrate:fresh --seed --verbose

  - name: Directory Permissions
    run: chmod -R 775 storage

  - name: 📂 Sync files
    uses: SamKirkland/FTP-Deploy-Action@4.0.0
    with:
      server: ${{ secrets.FTP_SERVER }}
      username: ${{ secrets.FTP_USERNAME }}
      password: ${{ secrets.FTP_PASSWORD }}
      server-dir: /
      local-dir: ./
      exclude: |
        vendor/*
        node_modules/*
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vf50do2cyejfx5pzg1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0vf50do2cyejfx5pzg1p.png" alt="Image description" width="800" height="335"&gt;&lt;/a&gt;&lt;br&gt;
এর পরেই Commit changes Button এ ক্লিক করুন, তাহলে যদি আপনার গিট এ master branch এ কোন কোড থাকে তাহলে সে গুলো আপনার cpanel এর public_html folder এ জমা হবে। এবং লোকাল এ আপনাকে master branch থেকে পুল নিয়ে আপডেট থাকতে হবে। ১ম বার অনেক সময় নিবে আপলোড দেয়ার সময়, কিন্তু পরের বার থেকে আর সময় নিবে না তেমন। master branch এ নতুন কোন কোড push হয়ে গেলেই আপনাআপনি সার্ভারে চলে যাবে কোন প্রকার ঝামেলা ছাড়া, এতে করে সময় অনেক কম লাগে, কাজে অনেক বুস্টিং পাওয়া যায়।&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxqduitn4zvzvt47jxkp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxqduitn4zvzvt47jxkp.png" alt="Image description" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;আসা করি আপনারা বুজতে পেরেছেন। কোন ভুল হলে কমেন্ট এ জানিয়ে দিবেন দয়া করে।&lt;br&gt;
আর ভাল লাগলে কমেন্ট করবেন&lt;br&gt;
ধন্যবাদ।&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>docker</category>
      <category>developers</category>
    </item>
  </channel>
</rss>
