peknet

an eddy in the bitstream

Page 35 of 76

CRUD

A year ago I announced the idea of a new Catalyst CRUD framework based on my previous work with Catalyst::Controller::Rose. The basic design hasn’t changed much, and a year later, CatalystX::CRUD (CXCRUD) 0.30 hit CPAN today, along with a bunch of related modules.

Here’s the rundown:

CatalystX::CRUD
The core API and base classes. There’s a RPC-style Controller, a REST-style Controller, a Model, a ModelAdapter, and some support for those, especially for testing. There’s been some misunderstanding about what CXCRUD is. It’s not a scaffolding creator. It’s not a code generator. It’s not even really a framework. It’s an API and some base classes that help implement the API. That’s about it. CXCRUD makes it easier to get your form code and your model code into HTTP-land with Catalyst.
CatalystX::CRUD::Controller::RHTMLO
This base controller assumes you are using Rose::HTML::Form as your form class. The .pm file is only 200 lines long, most of which is documentation. The point is that CatalystX::CRUD::Controller (the base class) implements everything, and the RHTMLO version just adapts it a little to Rose::HTML::Form.
CatalystX::CRUD::Model::RDBO
Brings your RDBO and RDBO::Manager classes into the Catalyst::Model namespace. Mostly this class just implements the core API methods for searching and fetching objects.
CatalystX::CRUD::ModelAdapter::DBIC
Makes it easy to use your existing Catalyst::Model::DBIC::Schema code with CXCRUD. I want to thank Zbigniew Lukasiak for pushing me toward this particular implementation and away from the earlier (and now deprecated) CatalystX::CRUD::Model::DBIC. I’ve been using this particular module lately on a project so it has gotten some needed attention.
CatalystX::CRUD::View::Excel
The core API is silent with regard to the View. That’s because the View is properly outside the concern of the create, read, update and delete actions. But that doesn’t mean the View is irrelevant. The Excel View lets you return CRUD results as an Excel file since that seems to be a useful format for manipulating data on the desktop, outside the HTTP sphere — and because it allows a far richer array of presentiation options that anything the core API could define.
CatalystX::CRUD::YUI
Six months ago I announced Rose::DBx::Garden::Catalyst, which continued to evolve as part of a project I was working on. It got to the point where I had put so much effort into the Template Toolkit design and Javascript (built on top of the Yahoo! User Interface library) that I felt it deserved to be split out into its own package and made independent of Rose::DB::Object.

CatalystX::CRUD::YUI 0.004 hit CPAN today. It conforms entirely to the core 0.30 CXCRUD API, which means that it is model-agnostic. You can use it with RDBO, DBIC and (hopefully soon) LDAP. Or whatever your model is. It just needs to implement the CatalystX::CRUD::Model or ModelAdapter API.

CatalystX::CRUD::YUI offers an easy way to do web-based administration of a database. It supports one2many and many2many relationships.

Rose::HTMLx::Form::Related
This package extends Rose::HTML::Form to perform model introspection. It currently has drivers for both RDBO and DBIC. It also comes out of the Rose::DBx::Garden::Catalyst project. Each model driver requires a helper package, either Rose::DBx::Object::MoreHelpers for RDBO or DBIx::Class::RDBOHelpers for DBIC. These helper packages implement the same methods and (in the case of RDBOHelpers in particular) aid in relationship introspection.
Rose::HTMLx::Form::Field::Serial
A new field type for RHTMLO for auto-increment fields.
Search::QueryParser::SQL
This is my latest project. It turns free-text queries into something that CXCRUD can use. There are methods for DBI, RDBO and DBIC, as well as raw SQL. Search::QueryParser is a great package, and it was fun to build on top of.
Rose::DBx::Garden::Catalyst
This package is now mostly a thin wrapper around CatalystX::CRUD::YUI and Rose::HTMLx::Form::Related, with the added features of code scaffolding generation. It’s sort of like a Catalyst Helper on steroids. Version 0.09 has been a long time (well, months) in development, and now includes real tests thanks to the contribution of a schema from Laust Frederiksen.

Form philosophy

A form management package has one goal: to help preserve the integrity of data as it moves from server to client and back again.

Most form packages do two things: validate data and serialize data as (X)HTML. Some offer additional client-side validation checks via Javascript, etc. Others offer tight integration with particular data models.

Rose::HTML::Objects does both things well. RHTMLO allows you to define form classes that represent reasonably complicated data models, providing validation and serialization.

Some developers are of the opinion that serialization is not properly the function of a form manager because it blurs the line between view and model. I disagree. Proper and correct serialization is important to the validation process, and hence vital to the model. It is but one step in a series of validation layers.

Validation happens when a human being completes a (X)HTML form, as she self-monitors her attempt to enter good and correct data (“did I spell that correctly?”). Validation may happen again before the form is submitted, using client-side Javascript. Validation happens again when the server receives the request. Again, when the form object is initialized with the submitted data. Again, when the data is committed to storage. At every step checks are made to preserve what the client submitted and verify that the data conforms with what is expected and required.

Since serialization to and from (X)HTML is part of the roundtrip all data takes, a good form management tool should be able to handle (X)HTML creation as well as server-side validation. That’s not blurring the model/view line; it’s reflecting the reality that data must be handled by human beings and the web browser is one of the best tools we currently have.

« Older posts Newer posts »

© 2024 peknet

Theme by Anders NorenUp ↑