Giter Club home page Giter Club logo

simple-mvc's Introduction

A simple MVC [VC] framework

A simple push & pull MVC framework heavly inspired to different PHP microframeworks and PHP MVC framework like ZF1.

Why?

I want to try out the test-driven development [at least write some tests ;)].

Just for my pleasure.

Goals

  • PHPUnit
  • Very simple implementation (only 8 classes + autoloader)
  • PHP 5.3+ implementation

Features

  • 100% MVC implementation [66% no model support] ;)
  • Useful hooks (Fixed events)
  • Loop Startup
  • Pre Dispatch
  • Init Hook
  • Post Dispatch
  • Loop Shutdown
  • View Renderer Switch
  • View Helpers
  • Partial views
  • Two step view (Layout support)
  • Controllers stack
  • Headers handler
  • Event manager (Self designed hooks)
  • Router
  • Only controller/action names
  • Dash URLs support (/a-dash/the-name-of-content)
  • Pull Driven requests
  • View request data to a controller-action
  • Rewritable views
  • Different views mount points for rewrite views

Install with Composer

If you want you can use Composer for install simple-mvc. Create the composer.json

{
    "require": {
        "wdalmut/simple-mvc": "*"
    }
}

Now you can install the framework

$ curl -s http://getcomposer.org/installer | php
$ php composer.phar install

You can use the Composer autoloader

<?php
require_once 'vendor/autoloader.php';

$app = new Application();
//...

Examples and docs

Build Status

  • Master branch
    • Build Status
  • Development branch
    • Build Status

The end.

simple-mvc's People

Contributors

lbanka avatar wdalmut avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

simple-mvc's Issues

Application refactor

Check and fix application.php.

  • should be less than 100 LOC
  • controllers configuration is quite complex

Add renderer switch

Actually is not possible to switch a views. In few words views are mapped on only one action.

<?php
public function actAction()
{
    $this->setRenderer('ctr/another-act.phtml')
}

Move headers to traits

Move the headers handling to traits in this way is more simple to add or remove header support.

Adding partials support

Adding partials view helper support

<?php
class View()
{
    public function __construct()
    {
        $view = $this;
        $this->addHelper("partial", function($path, $data) use ($view) {
            $view = $view->cloneThis();
            return $view->render($path, $data);
        });
    }
}

Separate Router from Route

Actually Router and the result Route are mixed into Route class. It's more useful separate the Router, in this way we can crete strategies to route to an action.

<?php
class Router
{
    public function assemble($args, $strategy) { }

    /**
     * @return RouteInterface
     *
    public function explode($path);
}

Chains could be created.

Hostname -> mapping -> RegExp -> action

Rewritable views stack

Could be interesting create a view path stack repository. In this scenario a top view could rewrite a previously view script path

Show this view path repository

 - path
    - defaults
       - views
    - personal
       - views

During the bootrap

$app->bootstrap('view', function(){
    $v = new View();

    $v->addViewPath(__DIR__ . '/../path/defaults/views');
    $v->addViewPath(__DIR__ . '/../path/personal/views');

    return $v;
});

If the view missing into personal/views the defaults/views will be used.

Error handling

actually no information about the error is sent to the error controller. it's impossible to understand what it's append into the application.

Add get, post, body params

Actually only params are accessible from a controller with a dedicated method. Add get, post, body params.

Add pull support

Actually the simple-mvc is a push MVC framework. It's interesting to add the pull strategy.

<?php
//$this->title === null

for ($i=0; $i<3; $i++) {
    $act = $this->pull("/ctr/act/id/{$i}");

    // pulled from a controller action
    echo $act["title"];
}

The pull operation could be use the return params of a controller action

<?php
class CtrController extends Controller
{
    public function actAction()
    {
        $params = $this->getParams();
        $id = $params["id"];
        return array('title' => 'The id: ' . $id);
    }
}

View & Layout helpers

View and layout helpers are completely separated and views are based on a prototype.

Imaging a title() helper that creates a text buffer able to mounting title parts only when a flush is required.

<?php
$layout->addHelper("title", function($part = false){
    static $parts = array();
    static $delimiter = ' :: ';

    return ($part === false) ? implode($delimiter, $parts) : $parts[] = $part;
});

The final goal is

<html>
    <head>
        <title><?php echo $this->title() ?></title>
    </head>
<body> ... </body>
</html>

During the application life cycle an user could appends parts (for more complex scenarios you have to improve title helper).

<?php
// An action view
$this->title("The main title");

The problem is views and layout are completely separated... The view never has the title helper.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.