2013-03-03 45 views
2

我有兩個關於中爾康模型的問題,我正在努力尋找一個答案:PhalconPHP模型

  1. 如何訪問的關係是不噴油器的模型?
  2. 創建不綁定到數據庫表的模型是否合理?如果不是,那麼我應該在哪裏放置不需要存儲的邏輯(某些函數可以使用API​​)?

回答

4

您可以通過使用getDefault()功能

$di = \Phalcon\DI\FactoryDefault::getDefault(); 

您可以擴展爾康模型揭露某些功能,並使用一個擴展您的模型訪問從代碼的任何位置Di。例如,考慮下面的模型,它提供了更多的功能(你可以隨意擴展它,在下面的示例中,我將展示如何使用構建器構建查詢,以及一個可用於獲取模式的函數對於

class MyModel extends \Phalcon\Mvc\Model 
{ 
    protected static function di() 
    { 
     return \Phalcon\DI\FactoryDefault::getDefault(); 
    } 

    public static function fetchSchema() 
    { 
     return "schema generators"; 
    } 

    public static function fetchById($id) 
    { 
     $results = null; 

     try { 

      $builder = self::getBuilder(); 

      $field = 'id'; 

      $bind[$field] = $id; 

      $builder->where("{$field} = :{$field}:"); 

      $query = $builder->getQuery(); 

      // One record is needed here so set the unique row 
      $query->setUniqueRow(true); 

      // Execute! 
      $results[] = $query->execute($bind); 

     } catch (\Exception $e) { 

      $results = self::exceptionToArray($e); 

     } 

     return $results; 
    } 

    protected static function getBuilder() 
    { 
     $di  = self::di(); 
     $manager = $di['modelsManager']; 
     $builder = $manager->createBuilder(); 
     $builder->from(get_called_class()); 

     return $builder; 
    } 

    protected static function execute($builder, $bind, $unique = false) 
    { 
     $query = $builder->getQuery(); 

     // One record is needed here so set the unique row 
     $query->setUniqueRow($unique); 

     // Execute! 
     $results = $query->execute($bind); 

     if (!$results || count($results) == 0) { 
      $results = array(); 
     } 

     return $results; 
    } 

    protected static function exceptionToArray($exception) 
    { 
     $results['error'] = array(
      'code'   => $exception->getCode(), 
      'file'   => $exception->getFile(), 
      'line'   => $exception->getLine(), 
      'message'   => $exception->getMessage(), 
      'trace'   => $exception->getTrace(), 
      'trace_as_string' => $exception->getTraceAsString() 
     ); 

     return $results; 
    } 
} 
1

一個特定的模式。我不知道這個特定的框架,但它絕對是一個壞主意來訪問內部應用程序代碼的依賴注入容器。一個依賴注入容器只應在的頂級存在它應該創建模型並將其完全構建的依賴關係傳遞給它所需的所有東西。

1)它非常緊密地將您的應用程序邏輯與這個框架不好,因爲你的代碼不便攜式

2)它使你的應用程序代碼可以訪問任何可能的依賴關係。這意味着它沒有明確的API。代碼實際上具有哪些依賴關係?如果不查看代碼並查看它從DI容器中提取的內容,則無法回答此問題。見:http://misko.hevery.com/code-reviewers-guide/flaw-digging-into-collaborators/