kletellier / mvc
A small MVC framework based on Symfony component and Eloquent ORM
Installs: 104
Dependents: 0
Suggesters: 0
Security: 0
Stars: 6
Watchers: 2
Forks: 1
Open Issues: 0
Language:HTML
Type:project
Requires
- php: >=5.4.9
- beberlei/assert: 2.8.*
- danielstjules/stringy: 3.1.*
- filp/whoops: 2.1.*
- hoa/mime: ~3.0
- illuminate/database: 5.3.*
- maximebf/debugbar: 1.*
- mobiledetect/mobiledetectlib: 2.8.*
- nesbot/carbon: 1.22.*
- nikic/php-parser: 3.1.*
- philo/laravel-blade: 3.*
- phpmailer/phpmailer: 6.0.*
- predis/predis: 1.1.*
- psr/log: 1.0.*
- symfony/class-loader: 3.4.*
- symfony/config: 4.0.*
- symfony/console: 4.0.*
- symfony/dependency-injection: 4.0.*
- symfony/event-dispatcher: 4.0.*
- symfony/filesystem: 4.0.*
- symfony/finder: 4.0.*
- symfony/http-foundation: 4.0.*
- symfony/routing: 4.0.*
- symfony/stopwatch: 4.0.*
- symfony/var-dumper: 4.0.*
- symfony/yaml: 4.0.*
Suggests
- kletellier/assets: Add mainstream assets integration easiest.
- phpoffice/phpexcel: For Excel file handling
- tecnickcom/tcpdf: For PDF handling
README
A small PHP MVC Framework using Symfony components, Eloquent ORM, FPDF, Redis and PHPExcel Wrapper.
Components
- Symfony
- Http Foundation
- Routing
- Yaml
- Dependency Injection
- Filesystem
- Finder
- Stopwatch
- Config
- Console
- Illuminate
- Eloquent
- Blade
- PHPMailer
- PSR Log
- Predis
Objective
The objective was to create a small framework for understand how it works in internal, and also for using it in small projects.
Installation
git clone https://github.com/kletellier/MVC.git /var/www
-
Give write access to cache,upload and tmp folders
-
Launch
composer update --prefer-dist
for download all packages needed and create autoload script -
Create a new website on your webserver pointing on public folder
-
Change website configuration file
Open config/parameters.yml
config: debug: true webpath: '' template: engine: blade # section in template config below cache: false alwaysreload: true locale: en database: default: server: 127.0.0.1 port: 3306 user: uid password: pwd database: dbname templates: # classes must implement \GL\Core\Templating\TemplateServiceInterface twig: class: \GL\Core\Twig\TwigService # need to install twig components blade: class: \GL\Core\Blade\Blade5Service mail: server: smtp.acme.com port: 587 user: user password: pwd secure: 1 encryption: "tls" redis: default: server: 127.0.0.1 port: 6379 enable: 0 security: security: classes : GL\Core\Security\AuthenticationService roles_table : roles users_table : users usersroles_table : usersroles cookie: token : typeyoursecuritytokenhere name : REMEMBERME duration : 3600 session: name: "kletellier"
The debug paramater display error description. Never use true in production website.
The webpath parameter is the root url of your website.
The template section set the engine used for rendering templates (default is blade).
The locale parameters is using for translator object (translation files are stored in lang folder).
in templates section, you can add your own tendering engine implementation, the class must implement \GL\Core\Templating\TemplateServiceInterface interface.
If you want using twig, just add twig in your composer.json and change type from blade to twig in config/template/engine section.
The mail section provide all parameters for mail sending. You can send mail by using mailer object in container. (See GL\Core\Tools\Mailer class).
The redis section provide all parameters for using redis cache system.
The security section :
- specify a security class who implement GL\Core\Security\AuthenticationServiceInterface , by default GL\Core\Security\AuthenticationService.
- You must create table by using console security:create
- Select a cookie session name, duration
- The route file configuration
Open config/routes.yml
pdf: pattern: /pdf controller: default action: pdf xls: pattern: /xls controller: default action: xls testdb: pattern: /testdb controller: default action: testdb root: pattern: /{name} controller: default action: hello defaults : { name : "World" }
Each route must have a key name (the section name), and must include pattern,controller and action. You can add optional value bye adding variable between bracket in pattern section, and also you must add defaults section and define default value for each optional parameter. The position is very important, for determining selected route, the parser select the first url pattern matching !!!
How it works
routing
We type http://localhost/xls in our browser, the routing component detect you're using xls
route, the controller was default
and the action to execute xls
.
If no route matched, 404 action of ErrorController was executed.
controller
All your controller are class that inherit from \GL\Core\Controller\Controller
.
You must store this file with a normalized name as ControllernameController.php in the /app/Application/Controllers
folder.
In our example DefaultController.php.
After this the controller resolver component will try to instanciate this controller and try execute the action , in our case the xls function.
The controller must return Symfony/Component/HttpFoundation/Response
via render methods proposed by abstract controller class.
By using
return $this->render(«Hello») ;
return a Http Response with 200 status code, with Hello text.
Controller embed many render functions, like renderJSON for rendering all objects as JSON string.
You can also redirect to other action/controller by using :
$this->redirect(«routename»,array(« param »=> value)) ; // routename is a route name defined in routes.yml
template
And also you have render function for using Blade Template engine.
return $this->render('index',array(« params »=> « value »)) ;
The render function submit all params provided in array to the template file index.blade.php.
All templates are stored in app/Application/Views
You can add some subfolders in Views for each controller, like Default folder for default controller.
By default, the template engine will take the template file in controller folder (in our case app/Application/Views/Default
) , if it will be not found, it will try to find them in Views root folder (app/Application/Views
).
Render function return an Symfony/Component/HttpFoundation/Response
, you can specify Http Status Code (by default 200) , and add headers as key-value array with overloaded methods.
If you only want the Html, you can use :
return $this->renderHtmlTemplate('index',array(« params »=> « value »)) ;
That return only raw Html.
All documentation about Blade are here [Blade] (https://laravel.com/docs/5.1/blade).
I've add an url function, for retrieve absolute url form relative url, based on webpath parameters in config/parameters.yml
{{ Utils::url('/xls') }}
give http://localhost/xls
You can use console with this command for clearing cache: php console cache:clear
.
You can add your own method in Blade by adding @use(\Application\Classes\MyClass) in the template and calling {{ MyClass:MyMethod($data) }}
.
If you doesn't want use Blade you can put PHP file in views folder and use
return $this->renderPHP('index.php',array(« params »=> « value »)) ;
it works like an include file.
Dependency injection
Each controller instance own his DI container, you can retrieve each service on this container, by using get function :
php $this->get('xls') // will give you PhpExcel Object ready to works
You have many services on each container :
- mailer :
\GL\Core\Tools\Mailer
instance, a wrapper of PHPMailer. - request :
Symfony\Component\HttpFoundation\Request
instance. - request_helper :
GL\Core\Helpers\RequestHelper
instance. - template :
GL\Core\Templating\TemplateProvider
instance. - routes :
Symfony\Component\Routing\RouteCollection
all routes defined inconfig/routes.yml
. - pdf :
GL\Core\Tools\PDF
instance, wrapper of TCPDF. - excel :
GL\Core\Tools\Excel
instance, wrapper of PhpExcel. - session :
Symfony\Component\HttpFoundation\Session\Session
instance. - crsf :
GL\Core\Security\FormCrsf
instance. - translator :
GL\Core\Config\Translator
instance. - security :
GL\Core\Security\SecurityService
instance. - debug :
GL\Core\Debug\KLDebugBar
instance (debug bar). - pdo : PDO instance of started database.
- config :
GL\Core\Config\Config
instance for reading yml config files. - db :
GL\Core\Helpers\DbHelper
instance for database interactions. - redis :
GL\Core\Tools\Redis
instance, wrapper of Predis.
You can add your own services in DI container by adding reference in config/services.yml
.
This is Symfony yml format more information here :
http://symfony.com/doc/current/components/dependency_injection/introduction.html
Eloquent ORM
You can create models in app/Application/Models
folder.
In example, you have test table in your database.
You create a PHP Class Test who inherit from Illuminate\Database\Eloquent\Model
.
You store it in app/Application/Models/Test.php
namespace Application\Models; use Illuminate\Database\Eloquent\Model; class Test extends Model { protected $table = 'test'; public $timestamps = false; }
In your controller you can access all data in this table,
// retrieve all entries from test table $tests = Test::all() ; // retrive only few entries $test2 = Test::where('column','=','value') ;
For more information about Eloquent ORM :
[Eloquent ORM] (http://laravel.com/docs/eloquent)
Documentation
For Symfony Component :
[Symfony] (http://symfony.com/fr/components)
For Eloquent ORM :
[Eloquent ORM] (http://laravel.com/docs/eloquent)
For Blade :
[Blade] (https://laravel.com/docs/5.1/blade)
For PHPMailer :
[PHPMailer] (https://github.com/PHPMailer/PHPMailer)