簡體   English   中英

PhalconPHP模型

[英]PhalconPHP model

我有兩個與Phalcon模型有關的問題,我正在努力尋找以下答案:

  1. 如何在模型中訪問Dependecy注入器?
  2. 創建未綁定到數據庫表的模型是否合理? 如果不是,那么我應該在哪里存儲不需要存儲的邏輯(某些函數可以與API一起使用)?

您可以使用getDefault()函數從代碼中的任何位置訪問Di

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

您可以擴展Phalcon模型以公開某些功能,並使用該功能擴展模型。 例如,考慮以下模型,該模型提供了更多功能(您可以隨時根據需要對其進行擴展。在下面的示例中,我將展示如何使用構建器來構造您的查詢以及一個可用於獲取模式的函數針對特定模型。

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)它非常緊密地將您的應用程序邏輯耦合到框架,這不好,因為您的代碼不可移植

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM