2009-10-31 2 views
3

CakePHP로 webapp을 작성하려고하는데 대부분의 웹 애플리케이션과 마찬가지로 데이터베이스가 초기화되었는지 여부를 감지하는 설치 프로그램을 만들고 싶습니다. .CakePHP 프레임 워크 내에서 데이터베이스 테이블 생성을 자동화하십시오.

이 프로세스는 완전히 자동화됩니다 (데이터베이스 자체는 이미 존재하며 암호가없는 익명 계정을 통해 전체 관리 액세스 권한이 부여 된 것으로 가정합니다 ... 이것은 샌드 박스 환경을위한 것이므로 보안에 대한 걱정은 없습니다) 따라서 데이터베이스 테이블이 생성되고 초기화 된 경우에는 요청에 관계없이 감지 할 수 있어야합니다. 그렇지 않은 경우 초기화를 투명하게 수행 한 다음 사용자의 원래 요청을 처리해야합니다.

모든 요청이 라우팅되는 일종의 부트 스트랩 컨트롤러를 작성하고 단일 SQL 쿼리를 실행하여 데이터베이스 테이블이 존재하는지 확인하는 것이 좋지만이 방법은 번거롭고 (컨트롤러에 해당 모델이 필요하며 ' 여기에있는 경우). 다른 가능성은 AppModel을 덮어 쓰고 동일한 테스트를 배치하는 것이 었습니다.하지만이 행을 따라 문서가 없기 때문에이를 수행하는 방법을 확신 할 수 없었습니다.

미리 감사드립니다.

TL; DR 버전 :는 J2EE 서블릿의 "초기화()"메소드의 (또는 방법에 해당하는이 CakePHP를 위해 쓸 수) CakePHP의 상응하는 무엇입니까?

답변

3

체크 아웃 AppError 클래스를 - 당신의 무시하고 거기에서 만들 데이터베이스 테이블 SQL을 실행할 수있는 누락 된 데이터베이스 테이블에 오류가있을 수 있습니다?

+0

그게 실제로 내가 뭘 찾고 있었는지 - 오류 페이지에 자동으로 테이블을 채울 스크립트에 링크를 제공하거나 생성 된 오류 인 경우 오류 클래스 내에서 간단하게 처리하는 것입니다. 감사! – Magsol

+0

@Magsol 정확히 이것을 어떻게 구현 했습니까? 궁금해. – khany

+0

확신하기가 힘들다. - 얼마 전에 있었지만, 나는'AppError' 클래스를 만들고 데이터베이스 스키마를 생성하는 코드로'missingTable' 에러 함수를 오버라이드했다. 소금 한 알갱이로 이것을 가져 가라. 나는 CakePHP가 5 년 만에 크게 변했다고 의심한다! – Magsol

2

요청마다 데이터베이스가 존재하는지 확인 하시겠습니까? 이것은 대단히 낭비 된 것 같습니다.

최초로 검사하면 데이터베이스가 설정되고 다음에 백만 건의 요청이있을 때마다 데이터베이스가 설정되어 있어도 다시 확인합니다!

누구든지 응용 프로그램을 설치하려면 몇 가지 설정을 요구하는 것이 좋습니다. 모든 요청 중에 이 아닌이 아닌 별도의 스크립트를 제공해야하지만 설치 중에 수동으로 실행해야합니다. CakePHP의이 할 수있는 최선의 방법에 대한 의견을 다시


, 당신은 데이터베이스 스키마 마이그레이션을위한 케이크의 지원 봤어? 이 같은

http://book.cakephp.org/view/734/Schema-management-and-migrations

+0

나는 그것을 매우 선호 할 것이다. 나는 J2EE 서블릿의 "init()"메소드와 동일한 CakePHP를 찾고 있다고 가정한다. 별도의 스크립트도 작동하지만 데이터베이스 테이블의 존재 여부에 대한 주 응용 프로그램의 검사가 필요하며, 그렇지 않은 경우 사용자에게 스크립트를 실행하도록 조언해야합니다. – Magsol

+0

존재하지 않는 테이블에 대한 쿼리는이 사실을 꽤 잘 보여줄 것이라고 생각합니다. –

+0

내 모든 요점은 CakePHP 프레임 워크에 익숙하지 않다는 점입니다. 웹 프로그래밍의 원칙과 패러다임을 이해합니다. CakePHP 환경에서 어떻게 구현하는지 간단히 알지 못합니다. 그 관점에서 어떤 조언을 찾고 있습니다. – Magsol

2

뭔가 당신이 찾고있는 무엇을 할 수 있지만, 모델에 따라 추가 쿼리를 필요로 않습니다. `당신의 모델,

<?php 
class AppModel extends Model { 
    var $create_query = false; 

    function __construct($id = false, $table = null, $ds = null) { 
     parent::__construct($id, $table, $ds); 

     if (!empty($this->create_query)) { 
      $this->query($this->create_query); 
     } 
    } 
} 
?> 

은 그럼 당신은 var $create_query = 'CREATE TABLE IF NOT EXISTS ...을 추가해야 만한다. MySQL CREATE TABLE documentation에는 존재하지 않는 경우에 대한 자세한 정보가 있습니다.

그러나이 질문()을 너무 일찍 호출하려고하지는 않습니다. 또는 테이블이 이미 존재하는지 확인하기 전에 이 있어야합니다. 그렇지 않으면 CakePHP는 테이블을 생성하는 대신 오류를 발생시킵니다. 주제에 대한 많은 문서가 없으며 cake/libs/model/model.php를 직접 살펴 보는 것이 더 많은 정보를 얻을 수 있습니다.

업데이트 : 위의 코드는 작성된대로 작동하지 않습니다.

Model 클래스를 조금 더 자세히 살펴본 후 Model :: __ construct는 Model :: setSource()를 호출합니다. Model :: setSource()는 테이블이 있는지 확인하고 테이블이 존재하지 않으면 에러를 던집니다. 이 방법을 사용하려면 쿼리를 무시하고 삽입해야합니다. 아래의 코드는 사용중인 CakePHP의 버전에 따라 다를 수 있습니다.

<?php 
function setSource($tableName) { 
    // From Model::setSource(). I believe this is needed to make query() work. 
    $this->setDataSource($this->useDbConfig); 

    // Create our table if we have a create query 
    if (!empty($this->create_query)) { 
     $this->query($this->create_query); 
    } 

    // Now call the parent 
    parent::setSource($tableName); 
} 
?> 
1

나는 이것을 한 번에 생각하고 좋은 방법을 생각해 냈습니다.

먼저 메모 : 앱에 app/config/database.php에 대한 쓰기 권한이 있어야 올바른 정보를 쓸 수 있다고 생각합니다. 해결 방법이 있지만 설치 프로그램이 작동하는 방법을 설명하겠습니다.

PHP 스크립트는 직접 작성하거나 삭제할 수 있습니다. 스크립트가 메모리에로드되고 나서 바이트 코드가 실행되기 때문에 일단 작업이 완료되면 파일에 종속되지 않습니다. 그래서 이론적으로 AppError 클래스를 오버라이드하여 특정 컨트롤러 (예 : SetupWizardController)를 실행하고 모든 일반 CakePHP를로드 할 수 있습니다. 일단 전체 마법사를 거치면, database.php 파일/setup을 작성하고, AppError 및 AppController 파일을 덮어 씁니다. (특정 경우에 앱이 설치되지 않은 경우 AppController가 필요하다는 것을 볼 수 있습니다) app/vendors/myapp와 같이 어딘가에 저장되는 것들. 스크립트 실행이 끝났으므로 이후 실행시 검사가 수행되지 않습니다.

이것은 Bill Karwin이 제기 한 문제를 제거하고 AppError를 활용하여 설치 프로그램을 작성합니다.

다른 방법으로 응용 프로그램에 환경 개념을 포함시키는 것입니다. 환경을 app/config/environment.php에 저장한다고 가정 해보십시오. 이 파일에 대한 쓰기 권한이 부여되며 설치가 끝나면 해당 액세스가 제거되거나 덮어 쓸 수 있습니다. 어쨌든 누군가가 여러분의 응용 프로그램을 배포하려고 시도 할 때마다 존재할 것이며, database.php는 environment.php 파일에서 데이터베이스를 자동으로 가져옵니다. 그런 다음 database.php 클래스의 생성자가 $ default 데이터베이스를 environment.php에 지정된 데이터베이스로 덮어 씁니다. database.php의 $ default는 NoDB Datasource를 참조합니다.이 데이터 소스는 AppController에서 확인할 수 있습니다 (더미 모델을 인스턴스화하고 데이터 소스를 확인할 수있을 것입니다). 그런 다음 필요한 Installer를 밀어 올립니다. 분명히 AppController를 덮어 썼을 것입니다.

관련 문제