THRIFT-4942 Set PHP struct generated field values as private with getters and setters
Client: php
Patch: Das Dedipyaman
This closes #1859
This closes #2238
diff --git a/compiler/cpp/src/thrift/generate/t_php_generator.cc b/compiler/cpp/src/thrift/generate/t_php_generator.cc
index c327854..10dc570 100644
--- a/compiler/cpp/src/thrift/generate/t_php_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_php_generator.cc
@@ -61,6 +61,8 @@
oop_ = false;
validate_ = false;
json_serializable_ = false;
+ getters_setters_ = false;
+
nsglobal_ = ""; // by default global namespace is empty
classmap_ = false;
for (iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) {
@@ -86,6 +88,8 @@
} else {
pwarning(0, "psr4 is default option! needn't add psr4 option!\n");
}
+ } else if (iter->first.compare("getters_setters") == 0) {
+ getters_setters_ = true;
} else {
throw "unknown option php:" + iter->first;
}
@@ -150,6 +154,13 @@
void generate_php_type_spec(std::ostream& out, t_type* t);
void generate_php_struct_spec(std::ostream& out, t_struct* tstruct);
+ void generate_generic_field_getters_setters(std::ostream& out, t_struct* tstruct);
+
+ void generate_reflection_setters(ostringstream& out, string field_name, string cap_name);
+ void generate_reflection_getters(ostringstream& out, string field_name, string cap_name);
+
+ std::string get_cap_name(std::string name);
+
/**
* Service-level generation functions
@@ -400,6 +411,11 @@
* Global namespace for PHP 5.3
*/
std::string nsglobal_;
+
+ /**
+ * Whether to generate getters and setters
+ */
+ bool getters_setters_;
};
bool t_php_generator::is_valid_namespace(const std::string& sub_namespace) {
@@ -808,7 +824,80 @@
indent_down();
indent(out) << ");" << endl << endl;
}
+/**
+ * Generates necessary accessors and mutators for the fields
+ */
+void t_php_generator::generate_generic_field_getters_setters(std::ostream& out,
+ t_struct* tstruct) {
+ std::ostringstream getter_stream;
+ std::ostringstream setter_stream;
+ // build up the bodies of both the getter and setter at once
+ const vector<t_field*>& fields = tstruct->get_members();
+ vector<t_field*>::const_iterator f_iter;
+ for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
+ t_field* field = *f_iter;
+ std::string field_name = field->get_name();
+ std::string cap_name = get_cap_name(field_name);
+
+ indent_up();
+ generate_reflection_setters(setter_stream, field_name, cap_name);
+ generate_reflection_getters(getter_stream, field_name, cap_name);
+ indent_down();
+ }
+
+ indent(out) << endl;
+ out << getter_stream.str();
+ out << setter_stream.str();
+ indent(out) << endl;
+}
+/**
+ * Generates a getter for the generated private fields
+ */
+void t_php_generator::generate_reflection_getters(ostringstream& out,
+ string field_name,
+ string cap_name) {
+
+
+ out << indent() << "public function " << "get" << cap_name << "()" << endl
+ << indent() << "{" << endl;
+
+ indent_up();
+
+ out << indent() << "return $this->" << field_name << ";" << endl;
+
+ indent_down();
+ out << indent() << "}" << endl;
+ out << endl;
+}
+/**
+ * Generates a setter for the generated private fields
+ */
+void t_php_generator::generate_reflection_setters(ostringstream& out,
+ string field_name,
+ string cap_name) {
+
+ out << indent() << "public function set" << cap_name << "(" << "$" << field_name << ")" << endl
+ << indent() << "{" << endl;
+
+ indent_up();
+
+ out << indent() << "$this->" << field_name << " = $" << field_name << ";" << endl;
+
+
+ indent_down();
+ out << indent() << "}" << endl;
+ out << endl;
+}
+/**
+ * Gets the first-letter capitalized name for the field
+ *
+ * @param std::string name of the field
+ */
+std::string t_php_generator::get_cap_name(std::string name) {
+ name[0] = toupper(name[0]);
+ return name;
+}
/**
* Generates a struct definition for a thrift data type. This is nothing in PHP
* where the objects are all just associative arrays (unless of course we
@@ -901,6 +990,9 @@
out << indent() << "}" << endl << endl;
out << endl;
+ if (getters_setters_) {
+ generate_generic_field_getters_setters(out, tstruct);
+ }
generate_php_struct_reader(out, tstruct, is_result);
out << endl;
generate_php_struct_writer(out, tstruct, is_result);
@@ -2782,4 +2874,5 @@
" rest: Generate PHP REST processors\n"
" nsglobal=NAME: Set global namespace\n"
" validate: Generate PHP validator methods\n"
- " json: Generate JsonSerializable classes (requires PHP >= 5.4)\n")
+ " json: Generate JsonSerializable classes (requires PHP >= 5.4)\n"
+ " getters_setters: Generate Getters and Setters for struct variables\n")