Advertisement
Serafim

Untitled

Dec 3rd, 2014
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.76 KB | None | 0 0
  1. <?php
  2. namespace app\support\lib;
  3.  
  4. use Illuminate\Http\Request;
  5. use Illuminate\Http\Response;
  6. use Illuminate\Routing\Route as Routing;
  7. use Illuminate\Support\ServiceProvider;
  8. use Illuminate\View\View;
  9.  
  10. class ResourceServiceProvider extends ServiceProvider
  11. {
  12.     /**
  13.      * @var array
  14.      */
  15.     protected $startups = [];
  16.  
  17.     /**
  18.      * @var bool
  19.      */
  20.     protected $defer = false;
  21.  
  22.     /**
  23.      * Register package
  24.      */
  25.     public function boot()
  26.     {
  27.         $this->package('app/resource', 'resource');
  28.     }
  29.  
  30.     /**
  31.      * @var array
  32.      */
  33.     protected $resources = [];
  34.  
  35.     /**
  36.      * @param $ext
  37.      * @param callable $handler
  38.      */
  39.     public function addResourceHandler($ext, callable $handler)
  40.     {
  41.         $this->resources[$ext] = $handler;
  42.     }
  43.  
  44.     /**
  45.      * @param string $prefix
  46.      * @param $class
  47.      */
  48.     public function controller($prefix = '/', $class)
  49.     {
  50.         $routes = $this->app['router']->getInspector()->getRoutable($class, '');
  51.  
  52.         foreach ($routes as $method => $route) {
  53.             $verb  = $route[0]['verb'];
  54.             $url   = $prefix . substr($route[0]['plain'], 1);
  55.  
  56.             $this->app['router']->$verb($url . '{type?}', ['after' => 'resource', 'uses' => $class . '@' . $method])
  57.                 ->where('type', '.(?:[a-z]+)');
  58.         }
  59.     }
  60.  
  61.     /**
  62.      * @param Routing $route
  63.      * @param Request $request
  64.      * @param Response $response
  65.      * @return mixed
  66.      */
  67.     public function getFilterResponse(Routing $route, Request $request, Response $response)
  68.     {
  69.         $ext = strlen($route->getParameter('type')) > 1
  70.             ? substr($route->getParameter('type'), 1)
  71.             : '';
  72.  
  73.         $view = $response->getOriginalContent();
  74.  
  75.         if ($view instanceof View && isset($this->resources[$ext])) {
  76.             return $this->resources[$ext]($route, $request, $response);
  77.         }
  78.  
  79.         return $view;
  80.     }
  81.  
  82.     /**
  83.      * @param Routing $route
  84.      * @param Request $request
  85.      * @param Response $response
  86.      */
  87.     public function filter(Routing $route, Request $request, Response $response)
  88.     {
  89.         $data = $this->getFilterResponse($route, $request, $response);
  90.         $response->setContent($data);
  91.     }
  92.  
  93.     /**
  94.      *
  95.      */
  96.     protected function registerDefaultHandlers()
  97.     {
  98.         $this->addResourceHandler('json', function(Routing $route, Request $request, Response $response) {
  99.             $view = $response->getOriginalContent();
  100.  
  101.             return [
  102.                 'data' => $view->getData(),
  103.                 'view' => [
  104.                     'name' => $view->getName(),
  105.                     'route' => str_replace('json', 'html', $request->getPathInfo()),
  106.                     'hash' => md5($response->getContent())
  107.                 ]
  108.             ];
  109.         });
  110.  
  111.         $this->addResourceHandler('html', function(Routing $route, Request $request, Response $response) {
  112.             return $response->getOriginalContent();
  113.         });
  114.     }
  115.  
  116.     /**
  117.      * @return $this|void
  118.      */
  119.     public function register()
  120.     {
  121.         $this->app['resource'] = $this->app->share(function ($app) {
  122.             $app['router']->filter('resource', function($route, $request, $response) use ($app) {
  123.                 return $app['resource']->filter($route, $request, $response);
  124.             });
  125.             $this->registerDefaultHandlers();
  126.             return $this;
  127.         });
  128.         return $this;
  129.     }
  130.  
  131.     /**
  132.      * @return array
  133.      */
  134.     public function provides() { return []; }
  135. }
  136.  
  137.  
  138.  
  139. /////////////
  140.  
  141.  
  142. <?php
  143. namespace app\support\lib;
  144.  
  145. use Illuminate\Support\Facades\Facade;
  146.  
  147. class ResourceFacade extends Facade
  148. {
  149.     protected static function getFacadeAccessor() { return 'resource'; }
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement