gpt4 book ai didi

mysql - 使用 Amfphp 作为 Flex 强类型对象获取 MySQL 数据时的最佳实践是什么

转载 作者:行者123 更新时间:2023-11-29 12:39:57 26 4
gpt4 key购买 nike

我正处于制定新项目架构的早期阶段。数据驱动的 Flex UI,位于网页中,调用 MySQL 数据的 Amfphp 服务来填充 Flex UI 中的元素。

很多关于如何解决这个问题的例子都已经过时或写得不好,所以我不仅希望完全理解数据流,而且希望实现清晰、稳健的实践。请检查我的方法,如果您认为我可以做得更好,请告诉我。

假设我想显示“主题”列表,让我们按照目前为止的流程进行操作。

Amfphp 服务

构建并填充名为“AtlasData”的 MySQL 数据库后,我开发了最初的 Amfphp 服务,该服务使用 Amfphp 后台服务浏览器,似乎返回一组强类型“VoSubject”对象。在我的开发 Mac(安装了 MAMP)的“amfphp/Services/vo”文件夹中,我有以下“VoSubject.php”文件:

<?php
/**
* Created by IntelliJ IDEA.
* User: Chris
* Date: 04/10/2014
* Time: 18:31
*/

class VoSubject {

/* *
* This Class models one row of the MySQL table. It has one field
* for each row of the Table and a special extra field.
* The extra field is $_explicitType, and its value is the fully qualified
* ActionScript Value Object I intend to use in the Flex application to model the data.
* If you don‚t configure this field correctly, then in the Flex app you
* will not get your strongly typed ActionScript class, but a dynamic object.
* */

public $subjectId;
public $subjectName;

// Explicit ActionScript class
var $_explicitType = "VoSubject";

}

我的 Amfphp 服务当前如下所示(请注意,为了简洁起见,我删除了一些方法):

<?php

require_once ('vo/VoSubject.php');

include ('DbAccess.php');

class AtlasService {

// This simple function can be used to test the service.
public function helloWorld() {
return "Hello World";
}

public function getAllSubjects() {

// Connect to the database using PHP Data Objects (PDO).

try {

/*
* The DbAccess class is a Singleton class.
* Create an instance of this class to access it's methods.
*/
$db = DbAccess::getInstance();

// Create a PHP Data Object.
$pdo = $db->getPDO();

} catch (PDOException $e) {

print "Connection Error!: " . $e->getMessage() . "<br/>";
die();
}

// Retrieve all rows from the AtlasData database 'subjects' Table.
try {

$tsql =
'SELECT s.`subjectId`, s.`subjectName`
FROM Subjects s';

$stmt = $pdo->prepare($tsql);
$stmt->execute();

// Fetch all of the data and place in variable '$results'.
$results = $stmt->fetchAll(PDO::FETCH_CLASS, 'VoSubject');

} catch (PDOException $e) {

print "Error when fetching data: " . $e->getMessage() . "<br/>";
die();
}

// Close the database connection.
$stmt = null;
$pdo = null;

// Return the array.
return $results;
}
}

使用 Amfphp 后台 - 服务浏览器调用“getAllSubjects”函数,将返回以下内容: Amfphp Back Office - Service Browser Result

看起来使用代码

$results = $stmt->fetchAll(PDO::FETCH_CLASS, 'VoSubject')

已将 $results 设置为 VoSubject 对象的数组。

弹性应用程序

现在我希望我的 Flex 应用程序调用 Amfphp 服务函数“getAllSubjects”。

在开发 Flex 项目时,我是 View Model Presenter 的拥护者,我知道这些项目的复杂性会不断增加。在这个项目的初期,我创建了以下内容:

View -SubjectBar_View(MXML 文件)演示者 -SubjectBar_Presenter(ActionScript 类)model - 模型(ActionScript 类)

我的SubjectBar_View 显示主题列表:

<s:List id="subjectList" dataProvider="{presenter.subjects}">
<s:layout>
<s:HorizontalLayout/>
</s:layout>
<s:itemRenderer>
<fx:Component>
<s:ItemRenderer>
<s:HGroup paddingLeft="2">
<s:Label text="{data.subjectName}" width="125"/>
</s:HGroup>
</s:ItemRenderer>
</fx:Component>
</s:itemRenderer>
</s:List>

MySubjectBar_Presenter 为要绑定(bind)的列表提供数据源,并且通过调用模型中的方法来设置此属性:

package presenters {

import flash.events.Event;

import models.Model;

import mx.collections.ArrayCollection;
import mx.events.FlexEvent;
import vo.VoSubject;

[Bindable]
public class SubjectBar_Presenter {

private var _model:Model = Model.getInstance();
private var _subjects:ArrayCollection;

public function get subjects():ArrayCollection {
return _subjects;
}

public function set subjects(value:ArrayCollection):void {
_subjects = value;
}

// Constructor.
public function SubjectBar_Presenter() {
// Add an eventListener to listen for property changes in the Model.
_model.addEventListener("subjectsChanged", onSubjectsChanged);
}

private function onSubjectsChanged(event:Event):void {

// Update the property.
this.subjects = _model.subjects;
}

public function onCreationComplete(event:FlexEvent):void {

// Get all Subjects from MySQL database.
_model.getAllSubjects();

}
}
}

我的模型连接到服务器并调用 Amfphp 服务函数“getAllSubjects”:

package models {

import flash.events.Event;
import flash.events.EventDispatcher;
import flash.net.NetConnection;
import flash.net.Responder;

import mx.collections.ArrayCollection;

// Custom Events.
[Event(name="subjectsChanged", type="flash.events.Event")]

public class Model extends EventDispatcher {

// Event Names.
public static const SUBJECTS_CHANGED:String = "subjectsChanged";

private static var _model:Model;
private var _subjects:ArrayCollection;
private var _netConnectionObject:NetConnection;
private var _responder:Responder = new Responder(handleAllSubjects, null);

public function get subjects():ArrayCollection {
return _subjects;
}

public function set subjects(value:ArrayCollection):void {
_subjects = value;

// Dispatch an event to allow the Detail view to update.
dispatchEvent(new Event(SUBJECTS_CHANGED));
}

public function get netConnectionObject():NetConnection {
return _netConnectionObject;
}

public function set netConnectionObject(value:NetConnection):void {
_netConnectionObject = value;
}

// Constructor.
public function Model(pvt:PrivateClass) {
// Call the 'init' function to carry out any preparatory work.
this.init();
}

// Singleton creator.
public static function getInstance():Model {
if (Model._model == null) {
Model._model = new Model(new PrivateClass());
//trace("Singleton instantiated");
}
else {
//trace("Sorry--already have a Singleton instantiated")
}
return Model._model;
}

private function init():void {

// Call any preparatory functions here.
this.createNetConnection();
}


private function createNetConnection():void {

netConnectionObject = new NetConnection();

//netConnection.connect( [server name] / [project folder] /amfphp);
netConnectionObject.connect("http://localhost/amfphp-2.2.1/amfphp/index.php");
}

private function handleAllSubjects(result:Object):void{
// trace(result.toString());

// The PHP method returns an Array NOT an ArrayCollection.
this.subjects = new ArrayCollection(result as Array);
}

public function getAllSubjects():void {

// Call the AtlasService.
//netConnection.call([Service Name]/[function name]", [Responder], [parameters]);
netConnectionObject.call("AtlasService/getAllSubjects", new Responder(handleAllSubjects, null));
}

}
}

class PrivateClass {
public function PrivateClass() {
//trace("Private class is up");
}
}

在我的 Flex 项目“src”文件夹中,我创建了一个“vo”文件夹并创建了以下“VoSubject”类来定义我的主题值对象:

package vo {
// This is the ActionScript Value Object class.
// This must match the PHP Value Object class defined within the amfphp/Services/vo folder.

[RemoteClass(alias="VoSubject")]
[Bindable]
public class VoSubject {

public var subjectId:int;
public var subjectName:String;

// Constructor.
public function VoSubject() {
}
}
}

这是我不确定的 Flex 端的 VoSubject 类的使用。 [RemoteClass(alias="VoSubject")] 行是否指向我的 amfphp/Services/vo 文件夹中的 php 类?如果是的话,这是相对于哪里的。它应该读取 [RemoteClass(alias="vo/VoSubject")] 因为我的 VoSubject.php 类位于我的 Services 文件夹中名为“vo”的文件夹中吗?

如果我调试我的应用程序,则会显示列表并填充主题名称。这很棒。但是,我的主题数据源似乎是包含 subjectId 和 subjectName 的对象的 ArrayCollection,而不是 VoSubject 对象的 ArrayCollection。

有人可以解释一下我如何确保“subjectBar_Presenter”类中的“subjects”数据源是强类型 VoSubject 对象的 ArrayCollection。此外,如果您觉得我可以改进我的方法,我非常愿意学习。

谢谢你看到最后!我期待您的想法。

克里斯

最佳答案

var $_explicitType = "VoSubject"; 应指向您的 ActionScript 类,在您的例子中为“vo.VoSubject”。 [RemoteClass(alias="VoSubject")] 应与显式类型匹配。简而言之,两者都引用了 actionscript 类。

乍一看,您的代码似乎遵循 MVC 模式,这总是好的。但我必须承认,我很快浏览了所有代码以找到实际问题。

关于mysql - 使用 Amfphp 作为 Flex 强类型对象获取 MySQL 数据时的最佳实践是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26255816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com