├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── composer.json
├── docs
├── Makefile
├── README.md
├── autoloader.rst
├── conf.py
├── controllers.rst
├── events.rst
├── example.rst
├── getting-started.rst
├── index.rst
├── make.bat
├── pull-driven.rst
└── views.rst
├── examples
├── base
│ ├── controllers
│ │ ├── ErrorController.php
│ │ └── IndexController.php
│ ├── layouts
│ │ └── layout.phtml
│ ├── public
│ │ ├── .htaccess
│ │ └── index.php
│ └── views
│ │ ├── error
│ │ └── error.phtml
│ │ ├── index
│ │ ├── index.phtml
│ │ ├── kindle.phtml
│ │ └── raw-post.phtml
│ │ └── pull
│ │ └── result.phtml
└── twig-integration
│ ├── .gitignore
│ ├── README.md
│ ├── composer.json
│ ├── composer.lock
│ ├── controllers
│ └── IndexController.php
│ ├── layouts
│ └── base.twig
│ ├── public
│ ├── .htaccess
│ └── index.php
│ └── views
│ ├── cache
│ └── .gitentry
│ ├── error
│ └── error.twig
│ └── index
│ └── index.twig
├── exts
├── HostnameRouter.php
├── README.md
├── StaticRouter.php
└── TwigView.php
├── pack
├── README.md
├── compile
├── composer.json
└── composer.lock
├── phpunit.xml
├── src
├── Application.php
├── Bootstrap.php
├── Controller.php
├── Dispatcher.php
├── EventManager.php
├── Layout.php
├── Loader.php
├── Request.php
├── Route.php
├── Router.php
└── View.php
└── tests
├── ApplicationTest.php
├── BootstrapTest.php
├── ControllerTest.php
├── DispatcherTest.php
├── EventManagerTest.php
├── LayoutTest.php
├── LoaderTest.php
├── RequestTest.php
├── RouteTest.php
├── RouterTest.php
├── ViewTest.php
├── bootstrap.php
├── classes
├── ns
│ └── Clazz.php
└── pr
│ └── Clazz.php
├── controllers
├── AdminController.php
├── AloneController.php
├── ErrorController.php
├── GeneralController.php
├── InitController.php
└── ThenController.php
├── layouts
├── alternate.phtml
├── layout.phtml
└── title-helper.phtml
├── resources
└── default.request.xml
├── views-rewrite
├── base.phtml
├── general
│ ├── c.phtml
│ ├── d.phtml
│ └── partial-eg.phtml
└── title.phtml
└── views
├── admin
└── login.phtml
├── base.phtml
├── general
├── b.phtml
├── c.phtml
├── d.phtml
├── direct.phtml
├── disable-layout.phtml
├── partial-eg.phtml
├── pull-driven.phtml
└── title-helper.phtml
├── only-base.phtml
├── partial.phtml
├── pull
├── buffer-out.phtml
├── driven-data.phtml
├── driven.phtml
├── missing-pull-action.phtml
└── missing-pull.phtml
├── title.phtml
├── view-mix-test.phtml
└── view-test.phtml
/.gitignore:
--------------------------------------------------------------------------------
1 | .project
2 | .buildpath
3 | .settings
4 | .DS_Store
5 | res
6 | *.phar
7 | pack/vendor
8 | *.swp
9 | *.swo
10 | docs/_build
11 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: php
2 | php:
3 | - 5.3.3
4 | - 5.3
5 | - 5.4
6 | before_script:
7 | script: phpunit
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (C) <2012>
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
4 | documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
5 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
6 | persons to whom the Software is furnished to do so, subject to the following conditions:
7 |
8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
9 | Software.
10 |
11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
12 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
13 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
14 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
15 |
16 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # A simple MVC [VC] framework
2 |
3 | A simple ***push & pull MVC framework*** heavly inspired to different PHP microframeworks and
4 | PHP MVC framework like ZF1.
5 |
6 | ## Why?
7 |
8 | I want to try out the test-driven development [at least write some tests ;)].
9 |
10 | Just for my pleasure.
11 |
12 | ## Goals
13 |
14 | * PHPUnit
15 | * Very simple implementation (***only 8 classes*** + autoloader)
16 | * PHP 5.3+ implementation
17 |
18 | ## Features
19 |
20 | * 100% MVC implementation [66% no model support] ;)
21 | * Useful hooks (Fixed events)
22 | * Loop Startup
23 | * Pre Dispatch
24 | * Init Hook
25 | * Post Dispatch
26 | * Loop Shutdown
27 | * View Renderer Switch
28 | * View Helpers
29 | * Partial views
30 | * Two step view (Layout support)
31 | * Controllers stack
32 | * Headers handler
33 | * Event manager (Self designed hooks)
34 | * Router
35 | * Only controller/action names
36 | * Dash URLs support (/a-dash/the-name-of-content)
37 | * Pull Driven requests
38 | * View request data to a controller-action
39 | * Rewritable views
40 | * Different views mount points for rewrite views
41 |
42 | ## Install with Composer
43 |
44 | If you want you can use Composer for install simple-mvc.
45 | Create the `composer.json`
46 |
47 | ```json
48 | {
49 | "require": {
50 | "wdalmut/simple-mvc": "*"
51 | }
52 | }
53 | ```
54 |
55 | Now you can install the framework
56 |
57 | ```shell
58 | $ curl -s http://getcomposer.org/installer | php
59 | $ php composer.phar install
60 | ```
61 |
62 | You can use the Composer autoloader
63 |
64 | ```php
65 | =5.3.3"
20 | },
21 | "autoload": {
22 | "classmap": [
23 | "src/",
24 | "exts/"
25 | ]
26 | },
27 | "repositories": [
28 | {
29 | "type": "vcs",
30 | "url": "https://github.com/wdalmut/simple-mvc"
31 | }
32 | ]
33 | }
34 |
--------------------------------------------------------------------------------
/docs/Makefile:
--------------------------------------------------------------------------------
1 | # Makefile for Sphinx documentation
2 | #
3 |
4 | # You can set these variables from the command line.
5 | SPHINXOPTS =
6 | SPHINXBUILD = sphinx-build
7 | PAPER =
8 | BUILDDIR = _build
9 |
10 | # Internal variables.
11 | PAPEROPT_a4 = -D latex_paper_size=a4
12 | PAPEROPT_letter = -D latex_paper_size=letter
13 | ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
14 | # the i18n builder cannot share the environment and doctrees with the others
15 | I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
16 |
17 | .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
18 |
19 | help:
20 | @echo "Please use \`make ' where is one of"
21 | @echo " html to make standalone HTML files"
22 | @echo " dirhtml to make HTML files named index.html in directories"
23 | @echo " singlehtml to make a single large HTML file"
24 | @echo " pickle to make pickle files"
25 | @echo " json to make JSON files"
26 | @echo " htmlhelp to make HTML files and a HTML help project"
27 | @echo " qthelp to make HTML files and a qthelp project"
28 | @echo " devhelp to make HTML files and a Devhelp project"
29 | @echo " epub to make an epub"
30 | @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
31 | @echo " latexpdf to make LaTeX files and run them through pdflatex"
32 | @echo " text to make text files"
33 | @echo " man to make manual pages"
34 | @echo " texinfo to make Texinfo files"
35 | @echo " info to make Texinfo files and run them through makeinfo"
36 | @echo " gettext to make PO message catalogs"
37 | @echo " changes to make an overview of all changed/added/deprecated items"
38 | @echo " linkcheck to check all external links for integrity"
39 | @echo " doctest to run all doctests embedded in the documentation (if enabled)"
40 |
41 | clean:
42 | -rm -rf $(BUILDDIR)/*
43 |
44 | html:
45 | $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
46 | @echo
47 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
48 |
49 | dirhtml:
50 | $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
51 | @echo
52 | @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
53 |
54 | singlehtml:
55 | $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
56 | @echo
57 | @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
58 |
59 | pickle:
60 | $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
61 | @echo
62 | @echo "Build finished; now you can process the pickle files."
63 |
64 | json:
65 | $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
66 | @echo
67 | @echo "Build finished; now you can process the JSON files."
68 |
69 | htmlhelp:
70 | $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
71 | @echo
72 | @echo "Build finished; now you can run HTML Help Workshop with the" \
73 | ".hhp project file in $(BUILDDIR)/htmlhelp."
74 |
75 | qthelp:
76 | $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
77 | @echo
78 | @echo "Build finished; now you can run "qcollectiongenerator" with the" \
79 | ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
80 | @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/simple-mvc.qhcp"
81 | @echo "To view the help file:"
82 | @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/simple-mvc.qhc"
83 |
84 | devhelp:
85 | $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
86 | @echo
87 | @echo "Build finished."
88 | @echo "To view the help file:"
89 | @echo "# mkdir -p $$HOME/.local/share/devhelp/simple-mvc"
90 | @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/simple-mvc"
91 | @echo "# devhelp"
92 |
93 | epub:
94 | $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
95 | @echo
96 | @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
97 |
98 | latex:
99 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
100 | @echo
101 | @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
102 | @echo "Run \`make' in that directory to run these through (pdf)latex" \
103 | "(use \`make latexpdf' here to do that automatically)."
104 |
105 | latexpdf:
106 | $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
107 | @echo "Running LaTeX files through pdflatex..."
108 | $(MAKE) -C $(BUILDDIR)/latex all-pdf
109 | @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
110 |
111 | text:
112 | $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
113 | @echo
114 | @echo "Build finished. The text files are in $(BUILDDIR)/text."
115 |
116 | man:
117 | $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
118 | @echo
119 | @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
120 |
121 | texinfo:
122 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
123 | @echo
124 | @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
125 | @echo "Run \`make' in that directory to run these through makeinfo" \
126 | "(use \`make info' here to do that automatically)."
127 |
128 | info:
129 | $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
130 | @echo "Running Texinfo files through makeinfo..."
131 | make -C $(BUILDDIR)/texinfo info
132 | @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
133 |
134 | gettext:
135 | $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
136 | @echo
137 | @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
138 |
139 | changes:
140 | $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
141 | @echo
142 | @echo "The overview file is in $(BUILDDIR)/changes."
143 |
144 | linkcheck:
145 | $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
146 | @echo
147 | @echo "Link check complete; look for any errors in the above output " \
148 | "or in $(BUILDDIR)/linkcheck/output.txt."
149 |
150 | doctest:
151 | $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
152 | @echo "Testing of doctests in the sources finished, look at the " \
153 | "results in $(BUILDDIR)/doctest/output.txt."
154 |
--------------------------------------------------------------------------------
/docs/README.md:
--------------------------------------------------------------------------------
1 | # Documentation
2 |
3 | You can read the docs directly on: [ReadTheDocs](http://simple-mvc.readthedocs.org/en/latest/index.html)
4 |
--------------------------------------------------------------------------------
/docs/autoloader.rst:
--------------------------------------------------------------------------------
1 | Autoloader
2 | ==========
3 |
4 | `simple-mvc` provides two strategies for loading classes for itself
5 | and only one strategy for autoload your classes.
6 |
7 | Classmap
8 | --------
9 |
10 | The classmap loads only `simple-mvc` classes. If you have a self-designed
11 | autoloader you have to use this strategy for reduce conflicts during
12 | the autoloading process.
13 |
14 | .. code-block:: php
15 | :linenos:
16 |
17 | ClassName.php
58 | class Prefix_ClassName
59 | {
60 |
61 | }
62 |
63 | Namespace example:
64 |
65 | .. code-block:: php
66 | :linenos:
67 |
68 | ClassName.php
72 | class ClassName
73 | {
74 |
75 | }
76 |
77 |
78 |
--------------------------------------------------------------------------------
/docs/conf.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | #
3 | # simple-mvc documentation build configuration file, created by
4 | # sphinx-quickstart on Sat Sep 8 12:59:34 2012.
5 | #
6 | # This file is execfile()d with the current directory set to its containing dir.
7 | #
8 | # Note that not all possible configuration values are present in this
9 | # autogenerated file.
10 | #
11 | # All configuration values have a default; values that are commented out
12 | # serve to show the default.
13 |
14 | import sys, os
15 |
16 | # If extensions (or modules to document with autodoc) are in another directory,
17 | # add these directories to sys.path here. If the directory is relative to the
18 | # documentation root, use os.path.abspath to make it absolute, like shown here.
19 | #sys.path.insert(0, os.path.abspath('.'))
20 |
21 | # -- General configuration -----------------------------------------------------
22 |
23 | # If your documentation needs a minimal Sphinx version, state it here.
24 | #needs_sphinx = '1.0'
25 |
26 | # Add any Sphinx extension module names here, as strings. They can be extensions
27 | # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
28 | extensions = []
29 |
30 | # Add any paths that contain templates here, relative to this directory.
31 | templates_path = ['_templates']
32 |
33 | # The suffix of source filenames.
34 | source_suffix = '.rst'
35 |
36 | # The encoding of source files.
37 | #source_encoding = 'utf-8-sig'
38 |
39 | # The master toctree document.
40 | master_doc = 'index'
41 |
42 | # General information about the project.
43 | project = u'simple-mvc'
44 | copyright = u'2012, Walter Dal Mut'
45 |
46 | # The version info for the project you're documenting, acts as replacement for
47 | # |version| and |release|, also used in various other places throughout the
48 | # built documents.
49 | #
50 | # The short X.Y version.
51 | version = '0.1'
52 | # The full version, including alpha/beta/rc tags.
53 | release = '0.1.0'
54 |
55 | # The language for content autogenerated by Sphinx. Refer to documentation
56 | # for a list of supported languages.
57 | #language = None
58 |
59 | # There are two options for replacing |today|: either, you set today to some
60 | # non-false value, then it is used:
61 | #today = ''
62 | # Else, today_fmt is used as the format for a strftime call.
63 | #today_fmt = '%B %d, %Y'
64 |
65 | # List of patterns, relative to source directory, that match files and
66 | # directories to ignore when looking for source files.
67 | exclude_patterns = ['_build']
68 |
69 | # The reST default role (used for this markup: `text`) to use for all documents.
70 | #default_role = None
71 |
72 | # If true, '()' will be appended to :func: etc. cross-reference text.
73 | #add_function_parentheses = True
74 |
75 | # If true, the current module name will be prepended to all description
76 | # unit titles (such as .. function::).
77 | #add_module_names = True
78 |
79 | # If true, sectionauthor and moduleauthor directives will be shown in the
80 | # output. They are ignored by default.
81 | #show_authors = False
82 |
83 | # The name of the Pygments (syntax highlighting) style to use.
84 | pygments_style = 'sphinx'
85 |
86 | # A list of ignored prefixes for module index sorting.
87 | #modindex_common_prefix = []
88 |
89 |
90 | # -- Options for HTML output ---------------------------------------------------
91 |
92 | # The theme to use for HTML and HTML Help pages. See the documentation for
93 | # a list of builtin themes.
94 | html_theme = 'default'
95 |
96 | # Theme options are theme-specific and customize the look and feel of a theme
97 | # further. For a list of options available for each theme, see the
98 | # documentation.
99 | #html_theme_options = {}
100 |
101 | # Add any paths that contain custom themes here, relative to this directory.
102 | #html_theme_path = []
103 |
104 | # The name for this set of Sphinx documents. If None, it defaults to
105 | # " v documentation".
106 | #html_title = None
107 |
108 | # A shorter title for the navigation bar. Default is the same as html_title.
109 | #html_short_title = None
110 |
111 | # The name of an image file (relative to this directory) to place at the top
112 | # of the sidebar.
113 | #html_logo = None
114 |
115 | # The name of an image file (within the static path) to use as favicon of the
116 | # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
117 | # pixels large.
118 | #html_favicon = None
119 |
120 | # Add any paths that contain custom static files (such as style sheets) here,
121 | # relative to this directory. They are copied after the builtin static files,
122 | # so a file named "default.css" will overwrite the builtin "default.css".
123 | html_static_path = ['_static']
124 |
125 | # If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
126 | # using the given strftime format.
127 | #html_last_updated_fmt = '%b %d, %Y'
128 |
129 | # If true, SmartyPants will be used to convert quotes and dashes to
130 | # typographically correct entities.
131 | #html_use_smartypants = True
132 |
133 | # Custom sidebar templates, maps document names to template names.
134 | #html_sidebars = {}
135 |
136 | # Additional templates that should be rendered to pages, maps page names to
137 | # template names.
138 | #html_additional_pages = {}
139 |
140 | # If false, no module index is generated.
141 | #html_domain_indices = True
142 |
143 | # If false, no index is generated.
144 | #html_use_index = True
145 |
146 | # If true, the index is split into individual pages for each letter.
147 | #html_split_index = False
148 |
149 | # If true, links to the reST sources are added to the pages.
150 | #html_show_sourcelink = True
151 |
152 | # If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
153 | #html_show_sphinx = True
154 |
155 | # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
156 | #html_show_copyright = True
157 |
158 | # If true, an OpenSearch description file will be output, and all pages will
159 | # contain a tag referring to it. The value of this option must be the
160 | # base URL from which the finished HTML is served.
161 | #html_use_opensearch = ''
162 |
163 | # This is the file name suffix for HTML files (e.g. ".xhtml").
164 | #html_file_suffix = None
165 |
166 | # Output file base name for HTML help builder.
167 | htmlhelp_basename = 'simple-mvcdoc'
168 |
169 |
170 | # -- Options for LaTeX output --------------------------------------------------
171 |
172 | latex_elements = {
173 | # The paper size ('letterpaper' or 'a4paper').
174 | #'papersize': 'letterpaper',
175 |
176 | # The font size ('10pt', '11pt' or '12pt').
177 | #'pointsize': '10pt',
178 |
179 | # Additional stuff for the LaTeX preamble.
180 | #'preamble': '',
181 | }
182 |
183 | # Grouping the document tree into LaTeX files. List of tuples
184 | # (source start file, target name, title, author, documentclass [howto/manual]).
185 | latex_documents = [
186 | ('index', 'simple-mvc.tex', u'simple-mvc Documentation',
187 | u'Walter Dal Mut', 'manual'),
188 | ]
189 |
190 | # The name of an image file (relative to this directory) to place at the top of
191 | # the title page.
192 | #latex_logo = None
193 |
194 | # For "manual" documents, if this is true, then toplevel headings are parts,
195 | # not chapters.
196 | #latex_use_parts = False
197 |
198 | # If true, show page references after internal links.
199 | #latex_show_pagerefs = False
200 |
201 | # If true, show URL addresses after external links.
202 | #latex_show_urls = False
203 |
204 | # Documents to append as an appendix to all manuals.
205 | #latex_appendices = []
206 |
207 | # If false, no module index is generated.
208 | #latex_domain_indices = True
209 |
210 |
211 | # -- Options for manual page output --------------------------------------------
212 |
213 | # One entry per manual page. List of tuples
214 | # (source start file, name, description, authors, manual section).
215 | man_pages = [
216 | ('index', 'simple-mvc', u'simple-mvc Documentation',
217 | [u'Walter Dal Mut'], 1)
218 | ]
219 |
220 | # If true, show URL addresses after external links.
221 | #man_show_urls = False
222 |
223 |
224 | # -- Options for Texinfo output ------------------------------------------------
225 |
226 | # Grouping the document tree into Texinfo files. List of tuples
227 | # (source start file, target name, title, author,
228 | # dir menu entry, description, category)
229 | texinfo_documents = [
230 | ('index', 'simple-mvc', u'simple-mvc Documentation',
231 | u'Walter Dal Mut', 'simple-mvc', 'One line description of project.',
232 | 'Miscellaneous'),
233 | ]
234 |
235 | # Documents to append as an appendix to all manuals.
236 | #texinfo_appendices = []
237 |
238 | # If false, no module index is generated.
239 | #texinfo_domain_indices = True
240 |
241 | # How to display URL addresses: 'footnote', 'no', or 'inline'.
242 | #texinfo_show_urls = 'footnote'
243 |
--------------------------------------------------------------------------------
/docs/controllers.rst:
--------------------------------------------------------------------------------
1 | Controllers
2 | ===========
3 |
4 | The controller section
5 |
6 | Init hook
7 | ---------
8 |
9 | Before any action dispatch the framework executes the `init()` method.
10 |
11 | .. code-block:: php
12 | :linenos:
13 |
14 | view->hello = "hello";
52 |
53 |
54 | $this->then("/index/next");
55 | }
56 |
57 | public function nextAction()
58 | {
59 | $this->view->cose = "ciao";
60 | }
61 | }
62 |
63 | The result is the first view (`index.phtml`) concatenated to the
64 | second view (`next.phtml`).
65 |
66 | Redirects
67 | ---------
68 |
69 | You can handle redirects using the `redirect()` method
70 |
71 | .. code-block:: php
72 | :linenos:
73 |
74 | redirect("/contr/act", 302);
81 | }
82 | }
83 |
84 | Interact with layout and views
85 | ------------------------------
86 |
87 | You can disable the layout system at any time using the `disableLayout()`
88 | method.
89 |
90 | .. code-block:: php
91 | :linenos:
92 |
93 | disableLayout();
100 | }
101 | }
102 |
103 | You can disable the view attached to a controller using the `setNoRender()`
104 | method
105 |
106 | .. code-block:: php
107 | :linenos:
108 |
109 | setNoRender();
116 | }
117 | }
118 |
119 | Change the layout on the fly
120 | ----------------------------
121 |
122 | If you want to change your layout during an action or a plugin interaction
123 | you can use the resources manager
124 |
125 | .. code-block:: php
126 | :linenos:
127 |
128 | getResource("layout")->setScriptName("full-width.phtml");
134 | }
135 | }
136 |
137 | Obviously you must use the layout manager.
138 |
139 | Using headers
140 | -------------
141 |
142 | You can send different headers using `addHeader()` method
143 |
144 | .. code-block:: php
145 | :linenos:
146 |
147 | addHeader("Content-Type", "text/plain");
153 | }
154 | }
155 |
156 | Change View Renderer
157 | --------------------
158 |
159 | You can change the view renderer at runtime during an action execution.
160 |
161 | .. code-block:: php
162 | :linenos:
163 |
164 | setRenderer("/use/me");
170 | }
171 | }
172 |
173 | The framework will use the `use/me.phtml`
174 |
175 | The end.
176 |
--------------------------------------------------------------------------------
/docs/events.rst:
--------------------------------------------------------------------------------
1 | Events
2 | ======
3 |
4 | Events
5 |
6 | * `loop.startup`
7 | * `loop.shutdown`
8 | * `pre.dispatch`
9 | * `post.dispatch`
10 |
11 | Hooks
12 | -----
13 |
14 | The `loop.startup` and `loop.shutdown` is called once at the start and at the
15 | end of the simple-mvc workflow.
16 |
17 | The `pre.dispatch` and `post.dispatch` is called for every controlled pushed
18 | onto the stack (use the `then()` method).
19 |
20 | Hooks params
21 | ~~~~~~~~~~~~
22 |
23 | The `loop.startup` and the `loop.shutdown` have the `Application` object as
24 | first parameter.
25 |
26 | The `pre.dispatch` hook has the `Route` object as first parameter and the
27 | `Application` object as second.
28 |
29 | The `post.dispatch` hook has the `Controller` object as first paramter.
30 |
31 | * The router object is useful for modify the application flow.
32 |
33 | .. code-block:: php
34 | :linenos:
35 |
36 | getEventManager()->subscribe("pre.dispatch", function($router, $app) {
38 | // Use a real and better auth system
39 | if ($_SESSION["auth"] !== true) {
40 | $router->setControllerName("admin");
41 | $router->setActionName("login");
42 |
43 | $app->getBootstrap("layout")->setScriptName("admin.phtml");
44 | }
45 | });
46 |
47 | Create new events
48 | -----------------
49 |
50 | .. code-block:: php
51 | :linenos:
52 |
53 | getEventManager()->publish("my.hook", array($app));
56 |
57 | You can use the self-created hook using
58 |
59 | .. code-block:: php
60 | :linenos:
61 |
62 | getEventManager()->subscribe("my.hook", function($app) {/*The body*/});
64 |
65 |
66 |
--------------------------------------------------------------------------------
/docs/example.rst:
--------------------------------------------------------------------------------
1 | Examples of usage
2 | =================
3 |
4 | A simple base app execution
5 |
6 | .. code-block:: php
7 | :linenos:
8 |
9 | run();
13 |
14 | Execute with bootstrap
15 | ----------------------
16 |
17 | .. code-block:: php
18 | :linenos:
19 |
20 | bootstrap("say-hello", function(){
24 | return array('example' => 'ciao');
25 | });
26 |
27 | $app->run();
28 |
29 | Into a controller
30 |
31 | .. code-block:: php
32 | :linenos:
33 |
34 | getResource('example');
40 |
41 | echo $element["example"];
42 | }
43 | }
44 |
45 | Controller Forward
46 | ------------------
47 |
48 | You can pass to another controller using `then()`
49 |
50 | .. code-block:: php
51 | :linenos:
52 |
53 | then("/index/forward");
60 | }
61 |
62 | public function forwardAction()
63 | {
64 | // append to index or use it directly
65 | }
66 | }
67 |
68 | See `example` folder for a complete working example.
69 |
70 |
--------------------------------------------------------------------------------
/docs/getting-started.rst:
--------------------------------------------------------------------------------
1 | Getting Started
2 | ===============
3 |
4 | The goal is realize a web application in few steps.
5 |
6 | See scripts into `example` for a real example. The base is create
7 | a public folder where your web server dispatch the `index.php`.
8 |
9 | Create out from this folder the `controllers` path or whatever you
10 | want (eg. `ctrs`).::
11 |
12 | - controllers
13 | - IndexController.php
14 | - public
15 | - .htaccess
16 | - index.php
17 |
18 | In practice you are ready. See the `.htaccess`::
19 |
20 | RewriteEngine On
21 | RewriteCond %{REQUEST_FILENAME} -s [OR]
22 | RewriteCond %{REQUEST_FILENAME} -l [OR]
23 | RewriteCond %{REQUEST_FILENAME} -d
24 | RewriteRule ^.*$ - [NC,L]
25 | RewriteRule ^.*$ index.php [NC,L]
26 |
27 | The `index.php` is the main app entry point
28 |
29 | .. code-block:: php
30 | :linenos:
31 |
32 | setControllerPath(__DIR__ . '/../controllers');
40 | $app->run();
41 |
42 | The controller `IndexController.php` file should be like this
43 |
44 | .. code-block:: php
45 | :linenos:
46 |
47 | TheControllerName
73 | class TheControllerName extends Controller
74 | {
75 | public function theActionNameAction()
76 | {
77 | //the-action-name => theActionName
78 | }
79 | }
80 |
81 | Bootstrap resources
82 | -------------------
83 |
84 | You can bootstrap resources:
85 |
86 | .. code-block:: php
87 | :linenos:
88 |
89 | bootstrap('my-resource', function() {
92 | return new MyObject();
93 | });
94 |
95 | The bootstrap do not executes all hooks (lazy-loading of resources) but execute
96 | it ones only if your application needs it.
97 |
98 | .. code-block:: php
99 | :linenos:
100 |
101 | getResource("my-resource");
104 | $another = $this->getResource("my-resource");
105 |
106 | // IT IS TRUE!
107 | var_dump($resource === $another);
108 |
109 |
110 |
--------------------------------------------------------------------------------
/docs/index.rst:
--------------------------------------------------------------------------------
1 | .. simple-mvc documentation master file, created by
2 | sphinx-quickstart on Sat Sep 8 12:59:34 2012.
3 | You can adapt this file completely to your liking, but it should at least
4 | contain the root `toctree` directive.
5 |
6 | Welcome to simple-mvc's documentation!
7 | ======================================
8 |
9 | Contents:
10 |
11 | .. toctree::
12 | :maxdepth: 2
13 |
14 | getting-started
15 | autoloader
16 | controllers
17 | views
18 | events
19 | pull-driven
20 | example
21 |
22 |
23 | Indices and tables
24 | ==================
25 |
26 | * :ref:`genindex`
27 | * :ref:`modindex`
28 | * :ref:`search`
29 |
30 |
--------------------------------------------------------------------------------
/docs/make.bat:
--------------------------------------------------------------------------------
1 | @ECHO OFF
2 |
3 | REM Command file for Sphinx documentation
4 |
5 | if "%SPHINXBUILD%" == "" (
6 | set SPHINXBUILD=sphinx-build
7 | )
8 | set BUILDDIR=_build
9 | set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
10 | set I18NSPHINXOPTS=%SPHINXOPTS% .
11 | if NOT "%PAPER%" == "" (
12 | set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
13 | set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
14 | )
15 |
16 | if "%1" == "" goto help
17 |
18 | if "%1" == "help" (
19 | :help
20 | echo.Please use `make ^` where ^ is one of
21 | echo. html to make standalone HTML files
22 | echo. dirhtml to make HTML files named index.html in directories
23 | echo. singlehtml to make a single large HTML file
24 | echo. pickle to make pickle files
25 | echo. json to make JSON files
26 | echo. htmlhelp to make HTML files and a HTML help project
27 | echo. qthelp to make HTML files and a qthelp project
28 | echo. devhelp to make HTML files and a Devhelp project
29 | echo. epub to make an epub
30 | echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
31 | echo. text to make text files
32 | echo. man to make manual pages
33 | echo. texinfo to make Texinfo files
34 | echo. gettext to make PO message catalogs
35 | echo. changes to make an overview over all changed/added/deprecated items
36 | echo. linkcheck to check all external links for integrity
37 | echo. doctest to run all doctests embedded in the documentation if enabled
38 | goto end
39 | )
40 |
41 | if "%1" == "clean" (
42 | for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
43 | del /q /s %BUILDDIR%\*
44 | goto end
45 | )
46 |
47 | if "%1" == "html" (
48 | %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
49 | if errorlevel 1 exit /b 1
50 | echo.
51 | echo.Build finished. The HTML pages are in %BUILDDIR%/html.
52 | goto end
53 | )
54 |
55 | if "%1" == "dirhtml" (
56 | %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
57 | if errorlevel 1 exit /b 1
58 | echo.
59 | echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
60 | goto end
61 | )
62 |
63 | if "%1" == "singlehtml" (
64 | %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
65 | if errorlevel 1 exit /b 1
66 | echo.
67 | echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
68 | goto end
69 | )
70 |
71 | if "%1" == "pickle" (
72 | %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
73 | if errorlevel 1 exit /b 1
74 | echo.
75 | echo.Build finished; now you can process the pickle files.
76 | goto end
77 | )
78 |
79 | if "%1" == "json" (
80 | %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
81 | if errorlevel 1 exit /b 1
82 | echo.
83 | echo.Build finished; now you can process the JSON files.
84 | goto end
85 | )
86 |
87 | if "%1" == "htmlhelp" (
88 | %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
89 | if errorlevel 1 exit /b 1
90 | echo.
91 | echo.Build finished; now you can run HTML Help Workshop with the ^
92 | .hhp project file in %BUILDDIR%/htmlhelp.
93 | goto end
94 | )
95 |
96 | if "%1" == "qthelp" (
97 | %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
98 | if errorlevel 1 exit /b 1
99 | echo.
100 | echo.Build finished; now you can run "qcollectiongenerator" with the ^
101 | .qhcp project file in %BUILDDIR%/qthelp, like this:
102 | echo.^> qcollectiongenerator %BUILDDIR%\qthelp\simple-mvc.qhcp
103 | echo.To view the help file:
104 | echo.^> assistant -collectionFile %BUILDDIR%\qthelp\simple-mvc.ghc
105 | goto end
106 | )
107 |
108 | if "%1" == "devhelp" (
109 | %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
110 | if errorlevel 1 exit /b 1
111 | echo.
112 | echo.Build finished.
113 | goto end
114 | )
115 |
116 | if "%1" == "epub" (
117 | %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
118 | if errorlevel 1 exit /b 1
119 | echo.
120 | echo.Build finished. The epub file is in %BUILDDIR%/epub.
121 | goto end
122 | )
123 |
124 | if "%1" == "latex" (
125 | %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
126 | if errorlevel 1 exit /b 1
127 | echo.
128 | echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
129 | goto end
130 | )
131 |
132 | if "%1" == "text" (
133 | %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
134 | if errorlevel 1 exit /b 1
135 | echo.
136 | echo.Build finished. The text files are in %BUILDDIR%/text.
137 | goto end
138 | )
139 |
140 | if "%1" == "man" (
141 | %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
142 | if errorlevel 1 exit /b 1
143 | echo.
144 | echo.Build finished. The manual pages are in %BUILDDIR%/man.
145 | goto end
146 | )
147 |
148 | if "%1" == "texinfo" (
149 | %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
150 | if errorlevel 1 exit /b 1
151 | echo.
152 | echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
153 | goto end
154 | )
155 |
156 | if "%1" == "gettext" (
157 | %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
158 | if errorlevel 1 exit /b 1
159 | echo.
160 | echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
161 | goto end
162 | )
163 |
164 | if "%1" == "changes" (
165 | %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
166 | if errorlevel 1 exit /b 1
167 | echo.
168 | echo.The overview file is in %BUILDDIR%/changes.
169 | goto end
170 | )
171 |
172 | if "%1" == "linkcheck" (
173 | %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
174 | if errorlevel 1 exit /b 1
175 | echo.
176 | echo.Link check complete; look for any errors in the above output ^
177 | or in %BUILDDIR%/linkcheck/output.txt.
178 | goto end
179 | )
180 |
181 | if "%1" == "doctest" (
182 | %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
183 | if errorlevel 1 exit /b 1
184 | echo.
185 | echo.Testing of doctests in the sources finished, look at the ^
186 | results in %BUILDDIR%/doctest/output.txt.
187 | goto end
188 | )
189 |
190 | :end
191 |
--------------------------------------------------------------------------------
/docs/pull-driven.rst:
--------------------------------------------------------------------------------
1 | Pull Driven Requests
2 | ====================
3 |
4 | Typically MVC frameworks are "push" based. In otherwords use mechanisms to "push" data to
5 | a view and not vice-versa. A "pull" framework instead request ("pull") data from a view.
6 |
7 | Pull strategy is useful for example during a `for` statement (not only for that [obviously]...). Look
8 | for an example:
9 |
10 | .. code-block:: php
11 | :linenos:
12 |
13 | users as $user) : ?>
14 | pull("/detail/user/id/{$user->id}");
17 | ?>
18 |
19 |
name;?> surname; ?>
20 |
21 |
22 |
23 |
24 | `simple-mvc` implementation
25 | ---------------------------
26 |
27 | `simple-mvc` has ***push*** and ***pull*** mechanisms. The *push* is quite simple and a typical
28 | operation. See an example
29 |
30 | .. code-block:: php
31 | :linenos:
32 |
33 | var
39 | $this->view->var = "hello";
40 | }
41 | }
42 |
43 | The view show the pushed variable
44 |
45 | .. code-block:: php
46 | :linenos:
47 |
48 | var; ?>
49 |
50 | The `pull` strategy is quite similar but use the return statement of a controller to retrive
51 | all the information. Consider in advance that `simple-mvc` doesn't require a valid controller
52 | for retrive a view, that view is mapped directly. See an example
53 |
54 | .. code-block:: php
55 | :linenos:
56 |
57 |
58 |
66 |
67 | The view require a `pull` operation from a controller named `ctr` and action `act`. See it:
68 |
69 | .. code-block:: php
70 | :linenos:
71 |
72 | title = "The title";
80 |
81 | // The return type doesn't care...
82 | return $data;
83 | }
84 | }
85 |
86 | You can use a "pull" controller as a normal controller with the attached view, but remember
87 | that when you request for a "pull" operation the view is never considered and the framework
88 | remove it without consider the output, only the `return` statement will be used.
89 |
--------------------------------------------------------------------------------
/docs/views.rst:
--------------------------------------------------------------------------------
1 | Views
2 | =====
3 |
4 | The framework starts without view system. For add view support
5 | you have to add `view` at bootstrap.
6 |
7 | .. code-block:: php
8 | :linenos:
9 |
10 | bootstrap('view', function(){
14 | $view = new View();
15 | $view->addViewPath(__DIR__ . '/../views');
16 |
17 | return $view;
18 | });
19 |
20 | $app->run();
21 |
22 | The framework append automatically to a controller the right
23 | view using controller and action name. Tipically you have to
24 | create a folder tree like this: ::
25 |
26 | site
27 | + public
28 | + controllers
29 | - views
30 | - index
31 | - index.phtml
32 |
33 | In this way the system load correctly the controller path and the view
34 | script.
35 |
36 | Layout support
37 | --------------
38 |
39 | The layout is handled as a simple view that wrap the controller view.
40 |
41 | You need to bootstrap it. The normal layout name is "layout.phtml"
42 |
43 | .. code-block:: php
44 | :linenos:
45 |
46 | bootstrap('layout', function(){
49 | $layout = new Layout();
50 | $layout->addViewPath(__DIR__ . '/../layouts');
51 |
52 | return $layout;
53 | });
54 |
55 | You can change the layout script name using the setter.
56 |
57 | .. code-block:: php
58 | :linenos:
59 |
60 | setScriptName("base.phtml");
62 |
63 | View Helpers
64 | ------------
65 |
66 | If you want to create view helpers during your view bootstrap
67 | add an helper closure.
68 |
69 | .. code-block:: php
70 | :linenos:
71 |
72 | bootstrap('view', function(){
74 | $view = new View();
75 | $view->addViewPath(__DIR__ . '/../views');
76 |
77 | $view->addHelper("now", function(){
78 | return date("d-m-Y");
79 | });
80 |
81 | return $view;
82 | });
83 |
84 | You can use it into you view as:
85 |
86 | .. code-block:: php
87 | :linenos:
88 |
89 | now()?>
90 |
91 | You can create helpers with many variables
92 |
93 | .. code-block:: php
94 | :linenos:
95 |
96 | addHelper("sayHello", function($name){
98 | return "Hello {$name}";
99 | });
100 |
101 | View system is based using the prototype pattern all of your
102 | helpers attached at bootstrap time existing into all of your
103 | real views.
104 |
105 | Share view helpers
106 | ~~~~~~~~~~~~~~~~~~
107 |
108 | View helpers are automatically shared with layout. In this way
109 | you can creates global helpers during the bootstrap and interact with
110 | those helpers at action time.
111 |
112 | Pay attention that those helpers are copied. Use `static` scope for
113 | share variables.
114 |
115 | .. code-block:: php
116 | :linenos:
117 |
118 | bootstrap("layout", function(){
120 | $layout = new Layout();
121 | $layout->addViewPath(__DIR__ . '/../layouts');
122 |
123 |
124 | return $layout;
125 | });
126 |
127 | $app->bootstrap("view", function(){
128 | $view = new View();
129 | $view->addViewPath(__DIR__ . '/../views');
130 |
131 | $view->addHelper("title", function($part = false){
132 | static $parts = array();
133 | static $delimiter = ' :: ';
134 |
135 | return ($part === false) ? "".implode($delimiter, $parts)."" : $parts[] = $part;
136 | });
137 |
138 | return $view;
139 | });
140 |
141 | From a view you can call the `title()` helper and it appends parts of you
142 | page title.
143 |
144 | Escapes
145 | -------
146 |
147 | Escape is a default view helper. You can escape variables using the
148 | `escape()` view helper.
149 |
150 | .. code-block:: php
151 | :linenos:
152 |
153 | escape("Ciao -->"); // Ciao -->
155 |
156 | Partials view
157 | -------------
158 |
159 | Partials view are useful for render section of your view separately. In
160 | `simple-mvc` partials are view helpers.
161 |
162 | .. code-block:: html
163 | :linenos:
164 |
165 |
166 |
--------------------------------------------------------------------------------
/tests/views-rewrite/general/c.phtml:
--------------------------------------------------------------------------------
1 | This is c?> but rewrited
--------------------------------------------------------------------------------
/tests/views-rewrite/general/d.phtml:
--------------------------------------------------------------------------------
1 | This is D but rewrited
--------------------------------------------------------------------------------
/tests/views-rewrite/general/partial-eg.phtml:
--------------------------------------------------------------------------------
1 | partial("title.phtml", array("ciao" => 'ciao'));
--------------------------------------------------------------------------------
/tests/views-rewrite/title.phtml:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/views/general/b.phtml:
--------------------------------------------------------------------------------
1 | This is b?>
--------------------------------------------------------------------------------
/tests/views/general/c.phtml:
--------------------------------------------------------------------------------
1 | Original C view
--------------------------------------------------------------------------------
/tests/views/general/d.phtml:
--------------------------------------------------------------------------------
1 | This is D
--------------------------------------------------------------------------------
/tests/views/general/direct.phtml:
--------------------------------------------------------------------------------
1 |