PHP Architecture – Reference Architecture, Design, and Folder Structure

Architecturedesign-patternsPHP

I am currently working with PHP to develop a server client application and therefore, I am trying to design a reference architecture to guide me through my implementation process.

I really like the new mean stack folder structure and the component/modules way to do it but even here I do struggle a lot.

As an example:

/<project-name>
    index.php
    /static
        /css
            /main.css
        /js
            /user
                userFunctions.js
        /bower_components 
            /jquery
            /chart
            /fontawesome
            /template-engine
            ...
    /scripts
        /debug.php
        /checkCodingStyle.php
    /modules
        /user
            userDetailsController.php
            userListController.php
            userDetailsView.php
            userListView.php
            user.php
            userDao.php 
    /utils
        /db
            mysql.php
        /log
            log.php
        /lib
    /tests
        userUnitTest.php

There is one module, called "user" with two different views and controllers based on a data model user.php. The model can be accessed from the database calling the data access object userDao.php.

MVC + Dao allows me to seperate content and logic of my app by concern and also allows loose coupling between modules and strong cohesion inside each module.

But:

The model user might be something that I do need in other modules as well. Say we have a module event, I do want to reuse the data model user.php there, and it would be nice to use a user selection list based on userListView.php.

How do I do that? The userListView.php contains all the things I need, but it is connected to the userListController.php.

Is it wrong / bad when you call a data model from another module and reuse it in another modules controller?

Is there a better way in building up interfaces between modules, like services one module could call?

Best Answer

I think that most of the struggle you experience can be easily avoided by using a framework. So, unless your project is about using bare-bone PHP, use a framework.

People creating open source frameworks spend their time to solve this kind of issues so you can focus on the fun stuff rather than spending it on changing how files are organized.

For PHP I recommend you to take a look at the Symfony Project:
https://symfony.com/six-good-reasons

It has a large codebase that you can learn from, as many projects are based on symfony, or are using it's components.

There's also a list of best practices that includes information about organizing business logic:
https://symfony.com/doc/current/best_practices/index.html

If you are still skeptical towards frameworks and want to continue without using one, I also recommend this set of articles:

Create your own PHP Framework
http://symfony.com/doc/current/create_framework/index.html

Hope this helps!

Related Topic