Phalconのモデルに関連する2つの質問がありますが、その答えを見つけるのに苦労しています。
- モデル内のDependecyInjectorにアクセスするにはどうすればよいですか?
- データベーステーブルにバインドされていないモデルを作成することは妥当ですか?そうでない場合は、保存する必要のないロジック(APIで動作する一部の関数)をどこに配置する必要がありますか?
Phalconのモデルに関連する2つの質問がありますが、その答えを見つけるのに苦労しています。
関数Di
を使用して、コード内のどこからでもアクセスできます。getDefault()
$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/