简体   繁体   中英

Reusing forms and controllers in Codeigniter

I'm learning the OO and MVC paradigm (using Codeigniter and PHP). I continue to find warnings such as this: If you find yourself pasting the same code into multiple files, then you aren't using OO/MVC properly . So, here's a question for more experienced programmers.

  1. I have a create-user form that I am using two very similar versions of:

    • Version 1 (at /volunteer/register ) is created by an anonymous user. The form lives in the volunteers controller, and needs to be verified by an admin.

    • Version 2 (at /admin/create_volunteer ) is created by a logged-in admin. The form and validation is nearly the same, but it is submitted with different parameters.

  2. Another, similar example:

    I want to build different user dashboards that share a template, but will be used by different user roles and have different functions and information based on role. As I see it my choices are:

    1. Create a Dashboard controller with three functions defining the data loaded into the dashboard template.
    2. Add the a dashboard function to each role's controller (Volunteer, Admin etc).
    3. Create a controller for each case (Volunteer, Admin, etc.)

I apologize if this appears sophomoric but essentially I'm looking for rules-of-thumb to determine how to design architecture in MVC.

My questions:

  • In the first example, is my logical choice of controllers ( Volunteer & Admin ) less than ideal? Is code replication in this case an acceptable practice?
  • Can anyone recommend architecting tools to establish logical consistency and good workflow for MVC?

Especially since the two forms are not the same (different rules, different interface) there's absolutely nothing wrong having two separate view files if you need it. Loading the same view file in two different controllers or methods is perfectly acceptable, indeed it's appropriate . If there are only a few tweaks that need to be made, try to reuse the view file by passing different data to it.

If you want to simply load the form view file in different instances, that would save you some code duplication. Just set different rules and if needed, pass different data to the view. It's similar to using the same form to create and edit something in two different methods. If the output is going to be totally different, just write separate view files. If it's the same output but with different data - definitely reuse it.

Don't get obsessed with trying to not duplicate view fragment code - if you are writing even more code to force the reuse of a view file by modifying it for different instances, it kind of defeats the purpose. Try to just make it a general practice to make your code as reusable as possible.

So, without seeing your actual code - I'd say don't worry about it. In my experience, view files for front-end and back-end are almost always unique (completely different UI). In general, if you find you are duplicating the same very similar code a lot, it's time to write a function, class, or template for it.

It seems you would like to use some ACL for distinction between roles (Volunteer and Admin) that will check whether requested module or action can be accessed.

Creating different controllers for the roles doesn't seem to be a good choice since this architecture could not be reused - you don't want to reuse specific Admin or Volunteer functions in other applications but rather a module that lets you create and control such roles.

You would like to reuse a code offering particular functionality, this might be one controller, one model and some view files.

Most programmers consider duplicated code as a sign that the solution to a problem still can be improved.

If the problem in your case is that the from is defined in one controller but you need to use it in another controller as well, then you need a better place to define the form so that both controllers have access to it independently from each other.

Make the form configurable so it's possible to reuse it.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM