• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

singleton 결과값이 변경되지 않습니다.

23.06.28 11:42 작성 조회수 245

0

안녕하세요.

해당 강의 실습시 해결되지 않는 부분이 있어 문의 드립니다.
bind -> singleton 으로 변경했는데요. 결과값이 변경되지 않습니다. 어느부분을 놓쳤는지 알려주시면 감사하겠습니다.

  • 결과값

     

  • Acontroller.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class Acontroller extends Controller
{
    protected $result;
    protected $basecontroller;

    public function __construct(Basecontroller $basecontroller) //서비스 컨테이너
    {
        $this->basecontroller = $basecontroller;
    }

    public function multiple($num)
    {
        $this->result = $this->basecontroller->plus($num)*10;
        return $this->result;
    }
}
  • Basecontroller.php

    <?php
    
    namespace App\Http\Controllers;
    
    use Illuminate\Http\Request;
    
    class Basecontroller extends Controller
    {
        protected $result;
    
        public function __construct()
        {
            $this->result = 0;
        }
    
        public function plus($num)
        {
            $this->result = $num+5;
            return $this->result;
        }
    
    }
    
  • Aprovider.php

    <?php
    
    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    use App\Http\Controllers\Acontroller;
    use App\Http\Controllers\Basecontroller;
    
    class Aprovider extends ServiceProvider
    {
        /**
         * Register services.
         */
        public function register(): void
        {
            $this->app->singleton(Acontroller::class, function($app) {
                return new Acontroller($app->make(Basecontroller::class));
            });
        }
    
        /**
         * Bootstrap services.
         */
        public function boot(): void
        {
            //
        }
    }
    
  • web.php

    <?php
    
    use Illuminate\Support\Facades\Route;
    use App\Http\Controllers\Acontroller;
    
    Route::get('/', function () {
        return view('welcome');
    });
    
    Route::get('/one', function () {
        for ($i=0; $i < 3; $i++)
        {
            echo app(Acontroller::class)->multiple(2);
            echo "<br />";
        }
    
        return "------------";
    });
    
    
  • app.php

    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    // App\Providers\BroadcastServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,
    App\Providers\Aprovider::class,

답변 2

·

답변을 작성해보세요.

0

조효진님의 프로필

조효진

질문자

2023.06.29

해결 되었습니다^^

확인해주셔서 감사합니다~

0

음... 우선 보내주신 코드를 보았을 때는 오타나 이상이 없어 보입니다.

*
라라벨에서 Acontroller를 singleton 으로 설정한 다는 것은 프로젝트가 실행되는 동안 이 함수는 한개만 동작하게 한다는 의미이기 때문에 값이 더해져서 출력되는 것 입니다.

이 부분은 다른 수강생 분들도 질문을 하시는 경우가 많았습니다. 그런데 기본적으로 프로바이더를 등록 안하신 경우 였었습니다. 하지만 현재 app.php 를 보내주셨던 것을 보니 우선을 추가를 하신 것 같아 저 또한 무엇이 문제인지는 가늠하기가 어렵습니다.

다만 약간의 추측을 해보자면, 다음과 같은 내용을 체크해보시길 권장해 드립니다.
1. app.php 가 제대로 되어 있는지

프로바이더를 등록하는 app.php 는 config 폴더 안에 있습니다.
imageimage확률은 적지만 vscode 에서 제대로 구별되어서 나오는지를 체크해 주세요. 올려주신 app.php의 코드 색상이 달라 보여 제안드립니다.

추가로 강의 내용대로 작업하시면 라라벨 최신 버전에서도 문제없이 동작되는 것으로 확인됩니다.

image

조효진님의 프로필

조효진

질문자

2023.06.29

안녕하세요~

답변 주셔서 감사합니다.
알려주신 부분 확인했는데요.
제대로 작성한 것 같은데 안되네요.ㅠㅠ
뭐가 문제일까요?ㅠㅠ

가능하시면 라라벨 프로젝트 폴더를 통째로 압축해서 아래 메일로 보내주실 수 있으신가요? 제가 작업해봐도 동일한 증상이 발생되는지를 확인해 보겠습니다.
scbaek65@gmail.com

image 프로젝트 파일은 리눅스 안에 ubuntu 라는 이름이 붙은 폴더의 var/www 에 있으실 것으로 보입니다.

굉장히 간단한 오류였습니다. 저도 보내주신 이메일로 파일들을 비교해낸 뒤에야 찾을 수 있었습니다.
imageimage

첫번째 것이 보내주신 파일인데 정확히는 서비스 컨트롤러가 작동하지 않은 것이 아니라, Acontroller 가 singleton으로 등록은 되었지만 코드상 계속해서 70 이 더해지지 않고 result에 저장되던 것이 문제였습니다. 70 = 70 + 70 ~ 이 되어야 하는데 70 = 70 이 3번 반복되었다고 생각하시면 될 것 같습니다!

$this->result = 를 $this->result += 으로 바꾸어 주세요!

* 추가로 보내주신 프로젝트의 소유권이 전부 root 로 되어있었습니다. 라라벨에서 root 권한으로 프로젝트를 다운받게 되면 나중에 반드시 문제가 생기니 비주얼 스튜디오 코드에서 명령어 입력창에 ls -all 이라고 입력하신 뒤 혹시나 다음과 같이 되어 있으면 프로젝트를 새로 다시 받으셔야 합니다.
image