2013-07-28 30 views
5

Tôi đang cố gắng tạo một chức năng có thể tái sử dụng, nhưng mỗi khi tôi cố gắng sử dụng ứng dụng $ trong chức năng từ xa, tôi nhận được một màn hình trống. Đây là những gì làm việc:

$app = new \Slim\Slim(); 

//GET CHAPTERS 
$app->get(
    '/chapters', 
    function() use ($app) { 
     $app->contentType('application/json'); 
     executeSql('SELECT * FROM chapters ORDER BY id'); 
    } 
); 

//GENERIC SQL EXECUTE 
function executeSql($sql) { 
    try { 
     $db = getConnection(); 
     $stmt = $db->query($sql); 
     $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($results); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

Nhưng tôi đang cố gắng để di chuyển tiêu đề json theo chức năng và không thể có được điều này để làm việc (bị màn hình trắng trống):

$app = new \Slim\Slim(); 

//GET CHAPTERS 
$app->get(
    '/chapters', 
    function() { 
     executeSql('SELECT * FROM chapters ORDER BY id'); 
    } 
); 

//GENERIC SQL EXECUTE 
function executeSql($sql) use ($app) { 
     $app->contentType('application/json'); 
    try { 
     $db = getConnection(); 
     $stmt = $db->query($sql); 
     $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($results); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

là một cái gì đó sai với cú pháp của tôi hoặc làm thế nào tôi đang sử dụng PHP? Tôi cũng đã thử mà không có "sử dụng ($ app)" ở tất cả, nhưng vẫn còn cùng một vấn đề.

+0

Bạn gặp bất kỳ lỗi nào khi bạn nhận được một trang trống không. – Perry

Trả lời

13

Cách dễ dàng để khắc phục điều này là sử dụng getInstance();

function yourFunction(){ 
    $app = \Slim\Slim::getInstance(); 
} 
+0

Cảm ơn bạn đã gửi mã .. – Dibish

+0

Xin cảm ơn vì mã này nó hoạt động. Nhưng tôi là một newbie PHP có thể bất cứ ai trên đây xác minh là điều này đúng cách để làm điều đó. – Ananda

+0

có, nhà phát triển Slim đặc biệt tạo phương thức getInstance để ứng dụng $ có thể được sử dụng trong chức năng –

0

từ khóa use chỉ áp dụng cho các cấu trúc đóng, ngoài việc sử dụng với không gian tên. vì vậy những gì bạn làm với chức năng thông thường không được hỗ trợ. bạn sẽ phải sử dụng global $app thường được coi là thực hành không tốt.

5

Bạn luôn có thể chuyển đối tượng $ app làm đối số cho hàm của bạn.

$app = new \Slim\Slim(); 

//GET CHAPTERS 
$app->get(
    '/chapters', 
    function() use ($app) { 
     executeSql($app, 'SELECT * FROM chapters ORDER BY id'); 
    } 
); 

//GENERIC SQL EXECUTE 
function executeSql(\Slim\Slim $app, $sql) { 
     $app->contentType('application/json'); 
    try { 
     $db = getConnection(); 
     $stmt = $db->query($sql); 
     $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($results); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 
+0

Có cách nào khác để làm điều đó không? Hiện tại, tôi đang chuyển đối tượng $ app làm đối số. Tôi không biết là nó đúng cách để làm điều đó .. – Dibish

+1

Tại sao không? Lựa chọn thay thế duy nhất khác của bạn là truy cập đối tượng Slim với khai báo chung. Bạn thường không muốn sử dụng các biến toàn cầu. Việc truyền đối tượng Slim làm tham số là một mẫu được gọi là [Dependency Injection] (http://en.wikipedia.org/wiki/Dependency_injection). DI là một thực hành tốt để làm theo, vì nó tách mã trong một hàm từ các phụ thuộc mà nó dựa vào. – maxiscool

+0

Cảm ơn bạn rất nhiều vì thông tin của bạn – Dibish

2

Giữ cuộc gọi cơ sở dữ liệu và phân tách logic/bản trình bày riêng biệt sẽ sạch hơn. Tôi sẽ trả về đối tượng "chương" của bạn ngay lập tức và xử lý bất cứ điều gì khác ngoài hàm executeSql.

$app = new \Slim\Slim(); 

// GET CHAPTERS 
$app->get('/chapters', function() use ($app) { 

    $app->contentType('application/json'); 

    $chapters = executeSql('SELECT * FROM chapters ORDER BY id'); 

    if ($chapters) { 
    $app->response->setStatus(200); 
    echo json_encode($results); 
    } else { 
    $app->response->setStatus(400); 
    echo '{"error":{"text":"error getting chapters"}}'; 
    } 

}); 

// GENERIC SQL EXECUTE 
function executeSql($sql) { 
    try { 
    $db = getConnection(); 
    $stmt = $db->query($sql); 
    $results = $stmt->fetchAll(PDO::FETCH_OBJ); 
    $db = null; 
    return $results; 
    } catch(PDOException $e) { 
    echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 
Các vấn đề liên quan