PHP Classes

How to Simplify the Development of Applications Based on PHP MVC Frameworks Phpnopea: Simplified MVC Web application framework

Recommend this page to a friend!
  Info   Example   Screenshots   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Last Updated Ratings Unique User Downloads Download Rankings
2024-09-27 (6 months ago) RSS 2.0 feedNot enough user ratingsTotal: 52 This week: 1All time: 10,676 This week: 42Up
Version License PHP version Categories
phpnopea 1.0MIT/X Consortium ...7Libraries, Design Patterns, PHP 7
Description 

Author

This package provides a simplified MVC Web application framework.

It provides a small set of classes to help implement PHP Web applications based on the Model-View-Controller design pattern.

Currently, it provides:

- Route requests based on URL patterns

- Model classes that store objects in databases using PDO

- Generate view output with templates based on an optimized version of the Blade template engine

- Abstract the access to request and response details

- Etc...

Picture of Joshy Francis
  Performance   Level  

 

Example

<?php

/*
Route::group(['middleware' => ['admin']], function () {
    Route::get('admin/dashboard', ['as'=>'admin.dashboard','uses'=>'AdminController@dashboard']);

    Route::get('admin/test', function () {
        return 'Admin Page';
        $user = auth()->user();
        dd($user);
        
    });
   
});
Route::post('forget_password', ['as'=>'user2.auth_forgot','uses'=>'User2LoginController@forget_password']);
Route::resource('password_reset', 'password_reset\password_resetController');
*/
   
include_once(app_path().'/Http/Controllers/Common/helper.php');
/*
Route::get('/', function (Request $request) {
   
    
    var_dump($request->getHost());
   
    
    echo "url is " , url()->current() , "\n";
    var_dump($request->url());
    var_dump($request->root());
    //var_dump($_SERVER);
    //var_dump($request);
  return <<<HTML
  <h1>Hello world</h1>
HTML;

});
*/
//return ;
//optional/arg2/asd/1/2
Route::get('optional/arg2/{name?}/{id?}/{c?}', function ($name = null,$id = null,$c = null) {
   
var_dump($name);
   
var_dump($id);
   
var_dump($c);
    echo
'<br>';
    return
'optional'. $name;
});
$optional2=function ($name = null,$id = null,$c = null) {
   
var_dump($name);
   
var_dump($id);
   
var_dump($c);
    echo
'<br>';
    return
'optiona2'. $name;
};
//optional2/arg2/asd/1/2
Route::get('optional2/arg2/',$optional2);
Route::get('optional2/arg2/{name}',$optional2);
Route::get('optional2/arg2/{name}/{id}',$optional2);
Route::get('optional2/arg2/{name}/{id}/{c}',$optional2);


Route::get('/routes', function ( Request $request ){
    
var_dump($request->url());
    return
'routes';
});
Route::get('/routes/index', function ( Request $request ){
    
var_dump($request->url());
    return
'routes/index';
});
Route::get('/routes/create', function ( Request $request ){
    
var_dump($request->url());
    return
'routes/create';
});
Route::get('/routes/{id}', function ($id1, Request $request ){
   
var_dump($id1);
    
var_dump($request->url());
    return
'routes/1';
});
Route::get('/routes/{id}/edit', function ($id1, Request $request ){
   
var_dump($id1);
    
var_dump($request->url());
    return
'routes/1/edit';
});
//routes/1/test/3/test2/2
Route::get('/routes/{id1}/test/{id3}/test2/{id2}', function ($id1,$id2,Request $request,$id3){///routes/1/test/3/test2/2
   
var_dump($id1);
   
var_dump($id2);
   
var_dump($id3);
   
//var_dump($request->url());
    //var_dump($request->session->getId() );
    //var_dump($request->session->token() );
    //var_dump($request->session->get('asd',null) );
    //var_dump($request->session->get('arr',null) );
   
    //return 'ok';
   
$request->session->save( );
   
//View::share('shared_data', 'share data on the fly');
   
$view = View::make('home',['test'=>$request->url(),'arr'=>[1,2,3,4] ]);
    return
$view->render();
});


//return ;

//admin/news
Route::group(['namespace' => 'Admin','middleware'=>['demo','web']], function(){
   
Route::get('admin/news', [ 'uses' => 'NewsController@index' ]);

   
Route::get('admin/users', [ 'uses' => 'UserController@index' ]);

});


Route::match(['get', 'post'], '/match', function(Request $request){
   
$url=$request->url();
    if(
$request->getrequestMethod()=='POST'){
       
var_dump($request->field1);
        return
'Match post<br/><a href="'.$url .'" >Back</a>';
    }else{
       
          return
"
            <form action=\"
$url\" method=\"POST\" >
                <input type=\"hidden\" name=\"field1\" value=\"form_data\" /><br/>
                Match get
                <input type=\"button\" onclick=\"document.forms[0].submit();\" value=\"submit\" />
           </form>
        "
;
    }
});
Route::any('/any', function(Request $request){
       
$url=$request->url();
    if(
$request->getrequestMethod()=='POST'){
       
var_dump($request->field1);
        return
'Any post<br/><a href="'.$url.'" >Back</a>';
    }else{

          return
"
            <form action=\"
$url\" method=\"POST\" >
                <input type=\"hidden\" name=\"field1\" value=\"form_data\" /><br/>
                Any get
                <input type=\"button\" onclick=\"document.forms[0].submit();\" value=\"submit\" />
           </form>
        "
;
    }
});
Route::get('/delete', function(Request $request){
       
$url=$request->url();
      return
"
        <form action=\"
$url\" method=\"POST\" >
            <input type=\"hidden\" name=\"_method\" value=\"DELETE\">
            <input type=\"hidden\" name=\"field1\" value=\"form_data\" /><br/>
            Delete
            <input type=\"button\" onclick=\"document.forms[0].submit();\" value=\"submit\" />
       </form>
    "
;
});
Route::delete( '/delete', function(Request $request){
   
var_dump($request->field1);
   
$url=$request->url();
        return
'Deleted<br/><a href="'.$url.'" >Back</a>';
});
//books/shelf/1
//books/shelf/store/1
//books/store/1
Route::group(['prefix' => 'books'], function () {
   
Route::group(['prefix' => 'shelf'], function () {
       
// First Route
       
Route::get('/1', function () {
            return
'Books/Shelf/1';
        });
       
Route::group(['prefix' => 'store'], function () {
           
// First Route
           
Route::get('/1', function () {
                return
'Books/Shelf/Store/1';
            });
        });
    });
   
// Second Route
   
Route::get('/1', function () {
        return
'Books 1';
    });
   
Route::group(['prefix' => 'store'], function () {
       
// Third Route
       
Route::get('/1', function () {
            return
'Books/store/1';
        });
    });
});
//files/1
Route::get('/files/{id}', function ($id) {
   
   
var_dump($id);
   
//var_dump( asset('storage/file.txt'));
   
   
Storage::disk('local')->put('file.txt', 'Contents');
   
Storage::put('files/file.txt', 'File Contents');
   
$contents = Storage::get('files/file.txt');
   
//$url = Storage::temporaryUrl( 'files/file.txt', now()->addMinutes(5) );
   
    //$path = $request->file('avatar')->store('avatars');
    //$path = Storage::putFile('avatars', $request->file('avatar'));
   
Storage::delete('files/file.txt');
   
//$path = Storage::putFileAs( 'avatars', $request->file('avatar'), $request->user()->id );

   
return $contents.':'.$id;
    return
$id;
});
//files2/1?head=test
Route::get('/files2/{id}', function (Request $request,$id) {
   
var_dump($request->input('head'));
   
var_dump($request->url());
    
    return
$id;
});


Route::get('/data', function (Request $request ) {
$url=$request->url();
  return
"
      <form action=\"
$url?route=fileupload\" enctype=\"multipart/form-data\" method=\"POST\" >
        <input type=\"hidden\" name=\"field1\" value=\"form_data\" /><br />
        <input multiple name=\"userfile[]\" type=\"file\" /><br />
            <script type=\"text/javascript\">
               // alert(document.forms[0]['field1'].value);
            </script>
           
        <input type=\"button\" onclick=\"document.forms[0].submit();\" value=\"submit\" />
   </form>
"
;
});
Route::post('/data', function (Request $request ) {
 
//return json_encode($request);
  //return $request->input('a');
  //var_dump($_FILES);
          
       
if($request->hasFile('userfile')) {
           
$doc=$request->file('userfile') ;
                
var_dump($doc);
            if(!
is_array($doc)){
               
//$filename= $doc->getClientOriginalExtension();
               
$filename=$doc->getClientOriginalName() ;
               
var_dump($filename);
               
//$doc->move(__DIR__ . '/../storage/app/public',$filename);
                //$path = Storage::putFileAs('avatars', $doc ,$filename );
               
$filename=uniqid().'.'.$file->getClientOriginalExtension() ;
               
//$path = Storage::putFileAs( $doc ,$filename );
               
$newfilename = $doc->store( );
               
//var_dump($newfilename);
           
}else{
                foreach(
$doc as $file){
                   
$filename=$file->getClientOriginalName() ;
                   
var_dump($filename);
                   
//$file->move(__DIR__ . '/../storage/app/public',$filename);
                    //$path = Storage::putFileAs('avatars', $file ,$filename );
                   
$filename=uniqid().'.'.$file->getClientOriginalExtension() ;
                   
//$path = Storage::putFileAs( $file ,$filename );
                    //$newfilename = $file->store( );
                    //$newfilename = $file->store('docs' );
                   
$newfilename = $file->store('docs', 'public' );//path,disk
                   
Storage::move($newfilename, 'docs/moved_'.uniqid().'.'.$file->getClientOriginalExtension());
                   
var_dump($newfilename);
                }
            }
        }
 
// var_dump($request->files);
 
return count($request->files);
 
});
Route::get('photo', function (Request $request ) {
   
//Storage::delete('avatars/logo.png' );
   
$Photo=Storage::get('logo.png' );
   
//var_dump($Photo);
    //header('Content-Type: image/jpeg');
    //return $Photo;
            //$contents = Storage::get('logo.png');
            //$affected = DB::update('update employee set signature=? where EmpId = ?', [$contents, 5]);
           
        //$employee = DB::select('select signature from employee where EmpId = ?',[5 ]);
        // if($employee && count($employee)>0){
            // $Photo=$employee[0]->signature;
        // }
       
if(!isset($Photo)){
           
//url('/').'/assets/No_Image_200x150.png';
            //storage_path().
           
$Photo=file_get_contents(public_path().'/assets/No_Image_200x150.png');
        }
    return
response($Photo)->withHeaders([
       
'Content-Type' => 'image/jpeg',
    ]);
});

   
Route::post('logout', function (Request $request ) {
       
auth()->logout();
        
        return
redirect('home');
    });

View::share('shared_data', 'shared accross all views');
Route::pattern('id', '[0-9]+');// Only called if {id} is numeric.

//Route::resource('rc/resource', 'ResourceController');
//Route::any('API/rc/resource', 'ResourceController@API');
Route::get('/home', 'HomeController@index') ;

Route::get('send_error_report', function (Request $request) {
   
var_dump($request->input('error_file'));
   
//var_dump($request);
});
   
// Registration Routes...
   
Route::get('/register', 'Auth\\RegisterController@showRegistrationForm') ;
   
Route::post('/register', 'Auth\\RegisterController@register') ;

   
// Authentication Routes...
   
Route::get('/login', 'Auth\\LoginController@index') ;
   
Route::post('/login', 'Auth\\LoginController@login') ;
   
//validatortest/create
   
Route::get('validatortest/create', 'ValidatorTestController@create');
   
Route::post('validatortest', 'ValidatorTestController@store');
    
   
//Route::get('/home', 'HomeController@index') ;
    //rc/resource/123/asd/m
   
Route::resource('rc/resource', 'ResourceController',['parameters' => [ "extra" => 'template_1' ]]);
   
Route::any('API/rc/resource', 'ResourceController@API');
   
Route::get('rc/resource/{id}/{id2}/m', 'ResourceController@method_test');

Route::group(['middleware' => ['web']], function ( ) {
   
   
Route::get('/test1', function ( Request $request ) {
        
//return 'middleware_web_ok' ;
        
return view('home',['test'=>$request->url(),'arr'=>[1,2,3,4] ]);
    });
   
Route::group(['middleware' => ['admin']], function ( ) {
       
Route::get('/test2', function ( Request $request ) {
           
//var_dump($middleware1);
            //var_dump($middleware2);
           
return 'middleware_web_admin_ok' ;
        });
    });
   
Route::group(['middleware' => ['user']], function ( ) {
       
Route::get('/test3', function ( Request $request ) {
           
//var_dump($middleware1);
            //var_dump($middleware2);
           
return 'middleware_web_user_ok' ;
        });
       
Route::group(['middleware' => ['demo']], function ( ) {
           
Route::get('/test4', function ( Request $request ) {
               
//var_dump($middleware1);
                //var_dump($middleware3);
               
return 'middleware_web_user_demo_ok' ;
            });
        });
    });
   
Route::get('/test5', function ( Request $request ) {
       
//var_dump($middleware1);
       
return 'middleware_web_ok' ;
    });
});


/*
                    Subdomain Routing
       
        http://www.w3programmers.com/laravel-route-groups/
       
file: C:\Windows\System32\Drivers\etc\hosts
    127.0.0.1 fakebook.dev
    127.0.0.1 asd.fakebook.dev
    127.0.0.1 qwe.fakebook.dev
    ::1 localhost
File Path : /apache/conf/extra/httpd-vhosts.conf or httpd.conf
 
<VirtualHost *:80>
DocumentRoot "C:\xampp\htdocs\laranopea\public"
ServerName fakebook.dev
<directory "C:\xampp\htdocs\laranopea\public">
    Options Indexes FollowSymLinks
    AllowOverride all
    Order Deny,Allow
    Deny from all
    Allow from all
</directory>
</VirtualHost>

*/

Route::group(['domain' => 'fakebook.dev'], function(){
   
Route::any('/', function(){
        return
'My own domain';
    });
});

Route::group(['domain' => '{username}.fakebook.dev'], function(){
   
Route::any('/', function($username){
        return
'You visit your account: '. $username;
    });
   
$data_user = [
       
'asd' => [
          
'profile' => ' a cute programmer. ',
          
'status' => [ 'I\'m cool!', 'I\'m cool very Cool!', 'Fantastic!']
         ],
       
'qwe' => [
          
'profile' => 'a boss programmer.' ,
          
'status' => [ 'Sweet!', 'Today is incredible!', 'Nice ..']
         ]
    ];
   
Route :: get ( 'profile', function ($username) use ($data_user){
            return
$username." is a ".$data_user[$username] [ 'profile'];
    });
   
Route :: get ('status', function ($username ) {
        return
$username. ' selected no status: ' ;
    });
   
Route :: get ('status/{id}', function ($username, $id) use ($data_user){
        return
$username. ' writes: '. $data_user [$username] ['status'] [$id];
    });
});


//return;

Route::get('/', function (Request $request) {
   
    return
redirect('home');
   
var_dump($request->getHost());
   
   
//var_dump(debug_backtrace());
   
echo "<pre>";
       
//debug_print_backtrace();
        // print backtrace, getting rid of repeated absolute path on each file
       
$e = new Exception();
       
//echo $e->getTraceAsString() ;
        //print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
        //var_dump($e->getTraceAsString());
       
       
function debug_backtrace_string() {
           
$stack = '';
           
$i = 1;
           
$trace = debug_backtrace();
            unset(
$trace[0]); //Remove call to this function from stack trace
           
foreach($trace as $node) {
               
/*
                if(isset($node['file'])) {
                    $stack .= "#$i ". $node['file'] ."(" .$node['line']."): ";
                }
                if(isset($node['class'])) {
                    $stack .= $node['class'] . "->";
                }
                $stack .= $node['function'] . "()" . PHP_EOL;
                */
               
$stack .="#$i " ;
                foreach(
$node as $k=>$v){
                    if(!
is_array($v) && !is_object($v)){
                       
$stack .= $k . "=" .$v. "\t";
                    }
                }
               
$stack .= PHP_EOL;
               
$i++;
            }
            return
$stack;
        }
        echo
debug_backtrace_string();
       
    echo
"</pre>";
    echo
"url is " , url()->current() , "\n";
   
var_dump($request->url());
   
var_dump($request->root());
   
var_dump($_SERVER);
   
var_dump($request);
  return <<<HTML
<h1>Hello world</h1>
HTML;
});

//return ;

for($i=0;$i<10000;$i++){//10000
    //route9999/321/test/123/test2/qwe
   
Route::get('/route'.$i .'/{id}/test/{id3}/test2/{id2}', function ($id,Request $request ) use($i) {
        return
$i .':' . $id;
    });
}


Details

<p align="center"><img src="phpnopea.svg"></p>

<p align="center"> <a href="https://github.com/JoshyFrancis/phpnopea"><img src="https://img.shields.io/github/downloads/JoshyFrancis/phpnopea/total.svg" alt="Total Downloads"></a> <img src="MIT.svg" alt="License"> </p>

About Phpnopea

Phpnopea is an alternative to laravel and excels in performance. It is based and built on same laravel principles. In our company, I was requested to speed up laravel and I came up with this.

Based on Laravel version 5.4.23

Features

  • Classes are minimal and optimized but all the necessary functions incorporated.
  • Blade template have been optimized to skip empty lines, comments(php,js,css) etc.(Only multiline comments allowed for single line php code eg:<?php /echo $share_otf;/ ?>) It helps dramatic reduction in file size as well as the bandwidth usage.
  • Only 30 classes are required for the whole framework and to run a typical laravel project.
  • Simplified error logging. Tracking errors is easier than ever.

Please visit <a href="http://joshyfrancis.c1.biz" target="_blank">http://joshyfrancis.c1.biz</a> to get an overview. This is the playground. You can register as a new user.

Visit <a href="http://joshyfrancis.c1.biz/route9999/23/test/123/test2/qwe" target="_blank">http://joshyfrancis.c1.biz/route9999/23/test/123/test2/qwe</a> to see the speed even on the 9999th route. Also check <a href="http://joshyfrancis.c1.biz/validatortest/create" target="_blank">http://joshyfrancis.c1.biz/validatortest/create</a> to see validator class in action.

  • check routes/web.php for more tests

I am working on the documentation. Please wait...


Screenshots (1)  
  • storage/app/public/docs/moved_5d14b4fda8cce.jpg
  Files folder image Files (86)  
File Role Description
Files folder imageapp (1 file, 1 directory)
Files folder imageclasses (33 files)
Files folder imageconfig (1 file)
Files folder imagepublic (8 files, 3 directories)
Files folder imageresources (1 directory)
Files folder imageroutes (1 file)
Files folder imagesql (1 file)
Files folder imagestorage (1 directory)
Accessible without login Plain text file .env Data Auxiliary data
Accessible without login Plain text file .htaccess Data Auxiliary data
Plain text file artisan Class Class source
Accessible without login Plain text file cache_clear.bat Data Auxiliary data
Accessible without login Image file if_simpline_48_2305614.png Icon Icon image
Accessible without login Plain text file index.php Example Example script
Accessible without login Plain text file LICENSE Lic. License text
Accessible without login Plain text file MIT.svg Data Auxiliary data
Accessible without login Plain text file phpnopea.svg Data Auxiliary data
Accessible without login Plain text file README.md Doc. Documentation
Accessible without login Plain text file storage_link.bat Data Auxiliary data

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads Download Rankings  
 100%
Total:52
This week:1
All time:10,676
This week:42Up