내가 한 노력들

[ codeigniter 4 ] 사용자 정의 Helper와 Library 본문

IT 공부/CodeIgniter

[ codeigniter 4 ] 사용자 정의 Helper와 Library

JONGI-N CHOI 2022. 3. 11. 14:57

Helper 와 Library의 차이점은, helper는 특정 하나의 기능을하는 함수 Library는 비슷한 기능의 메소드를 묶은 클래스라고 생각하면 편합니다.

 

 

Helper

현재 로그인 상태를 확인하여, 유저의 아이디를 화면에 출력하는 코드를 helper로 관리 

헬퍼를 사용하지 않고 view 파일에서 current user의 name을 가져오기 위해서는 비지니스 코드가 추가되어야만 합니다.

그거는 MVC구조에 좋지 못하기 때문에 helper를 통해 함수를 호출하는 것만으로 name을 가져올 수 있도록 합니다.

 

helper file 생성

helper의 file이름은 만들고자 하는 helper명에 "_helper"를 suffix로 붙혀주면 됩니다. 

 

app\helpers\auth_helper.php

<?php

if (!function_exists('current_user')) {

    if (!session()->has('user_id')) {

        return false;

    }
    
    $userModel = model('UserModel');

    return $userModel->find(session()->user_id);

}

function_exists()를 이용해서, 동일한 함수가 존재하는지를 먼저 체크합니다. 

 

session을 이용해서 현재 로그인이 된 상태인지 체크한 뒤, userModel으로 해당 id를 가진 user의 데이터를 받아 리턴합니다. 

 

Helper Load

helper('auth');

헬퍼를 사용하기 위해서는,  사용하고자 하는 부분에 helper()를 로드해주는 작업이 필요합니다. 

파라미터로는 로드하고 싶은 헬퍼명, 파일에서 작성한 헬퍼명을 넣어주면 됩니다.

 

여러곳에서 helper가 사용되는 경우라면 basecontroller에 load하게되면, 상속받는 모든 controller에서 사용가능합니다.

 

 

view

<?php if (current_user()): ?>

    <p>wellcome, <?= current_user()->name ?></p>
    <a href="<?= site_url("/logout") ?>" class="btn btn-primary">Logout</a>

<?php else: ?>

    <p>wellcome, guest</p>
    <a href="<?= site_url("/login") ?>" class="btn btn-primary">Login</a>

<?php endif; ?>

view에서는, 헬퍼의 함수를 직접적으로 접근하여 사용할 수 있습니다. 

helper의 current_user()를 사용하여 로그인 상태를 체크하고 접속한 유저의 name을 출력할 수 있게 됩니다.

 


Library

로그인을 담당하는 authentication class를 생성하여, login / logout / getCurrentUser 등의 메소드를 작성하여 관리합니다. 

 

Library를 사용하면, 기존에 복잡한 비지니스 로직을 한 곳에 정리하기 때문에 controller의 코드가 보기 쉬워지고, 유지보수에도 좋습니다. 

 

 

<?php

namespace App\Libraries;

class Authentication 
{
    private $user;

    public function login($email, $password)
    {
        $userModel = model('UserModel');
        $user = $userModel->findByEmail($email);

        if ($user === null) {

            return false;

        }

        if (!$user->verifyPassword($password)) {

            return false;

        } 

        $session = session();
        $session->regenerate();
        $session->set('user_id', $user->id);

        return true;
    }

    public function logout()
    {
        session()->destroy();
    }

    public function getCurrentUser()
    {
        if (!session()->has('user_id')) {

            return false;

        }

        // 중복되는 쿼리를 막기위해서, user가 없는 경우에만 query문을 실행하도록
        if (!$this->user) {

            $userModel = model('UserModel');
            
            $this->user = $userModel->find(session()->user_id);

        }

        return $this->user;
    }
}

 

controller

$auth = new \App\Libraries\Authentication();

Authentication 클래스의 인스턴스를 생성하여 

$auth->login($email, $password)

여러 메소드를 사용할 수 있습니다. 

 

 

Service

위와 같이 다이렉트로 인스턴스를 생성하는 방법도 있지만, service를 이용하여 생성하는 방법도 있습니다.

 

app\config\services.php

class Services extends BaseService
{
    
    public static function auth($getShared = true)
    {
    if ($getShared) {
        return static::getSharedInstance('auth');
    }

    return new \App\Libraries\Authentication();
    }
     
}

메소드의 이름과, getSharedInstance()의 파라미터에 service할 이름을 넣어주면 됩니다.

 

return new \App\Libraries\Authentication();

return으로는 Authentication의 인스턴스로 합니다.

 

Controller

$auth = service('auth');

그러면, 위에 다이렉트로 인스턴스를 생성하던 것에서 service를 통해서 간단히 생성이 가능합니다. 

 

service('auth')->login($email, $password);

또한, 변수에 넣지않고 바로 메소드에 접근하는 방식으로도 가능합니다.