2012-05-13 2 views
2

MVC를 이해하고 CI 프레임 워크를 배우려고합니다. MVC 및 CI에 대한 몇 가지 기본적인 질문에 대해 몇 가지 질문이 있습니다.PHP, MVC 및 Codeigniter 이해하기

1)보기는 내가 튜토리얼에서 읽은 것처럼 응용 프로그램의 시각적 인 부분입니다. 제 질문은 : 예 "로그인"버튼이 있지만 이미 사용자가 로그인 한 버튼이 "로그 아웃"입니다. 로그인 확인은 어디에서합니까? 컨트롤러 또는보기에서? 난 그냥 내가 그들이 상상 코드입니다, 그들은 일을 늘 알고 예로 theese 코드를 쓰기

//this is view// 

    <?php if($_SESSION('logged') == true):?> 
    <a href="logout">Logout</a> 
    <?php else: ?> 
    <a href="login">login</a>   
    <?php endif; ?> 

또는

//this is controller// 

if($_SESSION('logged') == true) 
$buttonVal = 'logout'; 
else 
$buttonVal = 'login'; 

//and we pass these value to view like 
$this->view->load('header',$someData); 

//this time view is like 
<a href="<?=$somedata['buttonVal']?>"><?=$somedata['buttonVal']?></a> 

을 의미하지만, 난 당신이 무슨 뜻인지있어 같아요. 로그인 확인은 컨트롤러 또는보기에 있어야합니까?

2) 모델에 데이터에 대한 코드 만 포함하고 컨트롤러로 반환해야합니까? 예를 들어 수학이 있다면 데이터베이스에서 2 개의 값을 얻고 곱해서 표시합니다. 모델이 증식 할 것인가 아니면 컨트롤러가 그것을 할 것인가? 여기

우리는 모델 데이터를로드 및 컨트롤러에 수학을 수행 // 모델

$db->query(....); 
    $vars=$db->fetchAll(); 

    return $vars; 

    //controller 
    $multi = $vars[0] * $vars[1]; 
    $this-load->view('bla.php',$mutli); 
여기에 우리가 모델 데이터를로드 너무 모델에 수학을

, 컨트롤러는 단지보기로 모델 데이터를 전달합니다

//model 

    $db->query(....); 
    $vars=$db->fetchAll(); 
    $multi = $vars[0] * $vars[1]; 
    return $multi; 

    //controller 
    $multi = $this->model->multiply(); 
    $this-load->view('bla.php',$mutli); 

나는 모델이 데이터베이스 작업 만하고 컨트롤러로 데이터를 전달해야하며 컨트롤러는 나머지 작업을 수행하고 렌더링보기를 보냅니다. 또는 모델이 작동하고 컨트롤러가이 모델을 가져 와서 보도록 보냅니다.

3)이 CodeIgniter의에 관한 것입니다, 내가 모든 페이지에 있어야하는 헤더를 가지고 있지만, CSS를 내가이 모든 페이지에있을 것입니다

 <?php foreach ($styles as $style): ?> 
     <link id="stil" href="<?= base_url() ?>/css/<?= $style ?>.css" rel="stylesheet" type="text/css" /> 
     <?php endforeach; ?> 

을 사용하고 페이지에 따라 자바 스크립트를 가지고, 그래서 모든 컨트롤러에서 나는 내가 그것을이 쓰기, 메인 컨트롤러를 만들기 위해 생각하고, 그리고 컨트롤러이 연장됩니다 내 모든 사람, 내가 CI 위키,이 MY_Controller 동일 MY_Controller 것을 볼

$data['styles'] = array('css1','css2'); 
$this->load->view('header', $headers); 

이 내가하고있는 것? 이 작업을 수행 할 수있는 다른 방법이 있습니까?

영어 및 거짓 질문에 불편을 끼쳐 드려 죄송합니다. 답변 주셔서 감사합니다.

+4

CodeIgniter를 사용하고 있으므로 나중에 MVC에 대한 오해를 모두 잊어 버릴 것이므로 MVC를 이해해야합니다. 이제는 효과가있는 것을하십시오. – Gordon

+0

이것을보십시오 : [MVC의 상세한 개요] (http://www.onextrapixel.com/2012/03/14/a-detailed-overview-of-the-model-view-controller-mvc-coding-structure/)) –

+0

@ Gordon이 오해가 무엇인지 자세히 설명해 주시겠습니까? – Repox

답변

5

에서 봐 주시기 바랍니다 : $logged_in의 값은 아마에 전화에서 검색 할 것

<?php if($logged_in):?> 
<a href="logout">Logout</a> 
<?php else: ?> 
<a href="login">login</a>   
<?php endif; ?> 

라이브러리 방법 :

<?php if ($this->auth->logged_in()): ?> 

인증은 전세계에 액세스하려는 것이므로 012로 전화를 걸 수 있습니다.은 여러 가지 이유로 컨트롤러 또는 뷰에 있습니다 (그러나 모델에는없는 경우 일 가능성이 있습니다). 모든 컨트롤러에서

은 내가

$data['styles'] = array('css1','css2');
$this->load->view('header', $headers);

예는 MY_Controller와 컨트롤러 클래스를 확장 할 수있다, 그러나 당신은보기/프리젠 테이션 계층이 유지 더 낫다. 나는 보통 마스터 템플릿 생성 :

<html> 
<head><!-- load assets --></head> 
<body id="my_page"> 
    <header /> 
    <?php $this->load->view($view); ?> 
    <footer /> 
</body> 
</html> 

을 그리고 약간의 로딩 템플릿에 대한 래퍼 클래스 쓰기 : 컨트롤러에서

class Template { 
    function load($view_file, $data) { 
     $CI = &get_instance(); 
     $view = $CI->load->view($view_file, $data, TRUE); 
     $CI->load->view('master', array('view' => $view)); 
    } 
} 

사용법 :

$this->template->load('my_view', $some_data); 

이 헤더를로드에서 당신을 저장을/꼬리말 반복적으로. 내 의견으로는 CSS 파일을로드하는 것과 같은 프리젠 테이션 로직 또는 페이지 제목이 가능할 때마다보기에 속해야합니다.

모델을 사용하기 전에 모델을 재사용 할 수 있기를 원합니다. 따라서 필요한 작업을 수행하고 데이터 조작 (일반적으로 데이터베이스 만)과 관련되도록하십시오. 귀하의 컨트롤러가 무엇을 해야할지 결정 데이터.

MVC와 관련이 없지만 일반적으로 가능한 적은 코드로 작성하고 싶습니다. 중복은 더 나은 해결책을 찾을 수있는 신호입니다. 이것들은 (귀하의 질문과 같이) 폭 넓은 조언이지만 잘하면 도움이됩니다.

+0

정말 좋은 답변을 해주셔서 고맙습니다. – Malixxl

-2

사용자 lo-gin 확인은 컨트롤러에 있어야합니다. 이것은 생성자에서 호출되어야하는 첫 번째 함수 여야합니다.

Below i have given the sample code which redirects the user to the login page if he is not logged in, hope this would give you some idea, 

<?php 

class Summary extends Controller { 

    function Summary() { 
     parent::Controller(); 
     $this->is_logged_in(); 
    } 

    function is_logged_in() { 
     $logged_in = $this->session->userdata('logged_in'); 
     if (!isset($logged_in) || $logged_in != true) { 
      $url = base_url() . 'index.php'; 
      redirect($url); 
      exit(); 
     } 
    } 

?> 

단추 변경은보기에서 세션 변수를 확인하고 그에 따라 결정함으로써보기에서 구현 될 수 있습니다.

절대적 로직, 내 의견으로는 그것을 할 수있는 올바른 방법을 볼 수 이것은이 link

+0

당신은'사용자 lo-gin 확인은 컨트롤러에 있어야합니다. '라고 말한 다음 로직을보기에 작성하는 것을 끝내 었습니다. – itachi

-1

1)보기 논리는 필요한 경우 간단하고 대부분 if-then 문이어야합니다. 예제에서 두 경우 모두 작동하지만 뷰에서 논리를 사용합니다. 그러나 로그인을 확인하고 로그인하지 않은 경우 리디렉션하는 경우 컨트롤러 (또는 라이브러리)에서 발생합니다.

2) Codeigniter 모델을 작성, 검색, 업데이트, 삭제 등의 데이터베이스 기능에 액세스하는 방법으로 생각하십시오. Codeigniter 모델에 대한 내 (느슨한) 규칙은 쿼리의 결과를 업데이트, 삭제 또는 삽입하거나 반입 쿼리에서 결과 집합을 반환하는 것입니다. 그러면 해당하는 수학 연산이 컨트롤러에서 발생할 수 있습니다. 이것이 매 번 발생하는 수학 연산 인 경우 라이브러리 함수에 추가하는 것을 고려하십시오. 아래를 참조하십시오 ...

3) 컨트롤러를 확장하는 것이 적절하고 최선의 방법입니다.

*) 접시에 음식을 더 넣지 말고 Codeigniter Libraries에 대해 자세히 알아보십시오. 예를 들어, 컨트롤러에서 라이브러리를로드 할 수 있습니다.그런 다음 컨트롤러에서 라이브러리 기능을 호출합니다. 라이브러리 함수는 데이터베이스 결과를 검색하는 모델을 호출합니다. 라이브러리 함수는 그 함수에 대해 수학을 수행하고 그 결과를 컨트롤러에 반환합니다. 컨트롤러에는 코드가 거의 없지만 라이브러리와 모델로 인해 많은 작업이 수행됩니다.

+0

-1 "모델을 데이터베이스 액세스 기능으로 생각". 모델은 데이터베이스가 아닙니다. – Gordon

+0

Codeigniter 사용자 안내서 "모델은 데이터베이스의 정보로 작업 할 수 있도록 고안된 PHP 클래스입니다." – csi

+0

모델은 단순한 CRUD 기능 이상입니다. – itachi