| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 | 
							- <?php
 
- /**
 
-  * User: Mike
 
-  * Email: m@9026.com
 
-  * Date: 2016/6/30
 
-  * Time: 14:37
 
-  */
 
- namespace App\Widget;
 
- use Closure;
 
- use Illuminate\Container\Container;
 
- use Illuminate\Support\Str;
 
- use Illuminate\View\Compilers\BladeCompiler;
 
- class Widget
 
- {
 
-     protected $container;
 
-     protected $blade;
 
-     protected $groups = array();
 
-     protected $widgets = array();
 
-     public function __construct( Container $container, BladeCompiler $blade )
 
-     {
 
-         $this->container = $container;
 
-         $this->blade     = $blade;
 
-     }
 
-     public function register( $name, $callback )
 
-     {
 
-         $this->widgets[ $name ] = $callback;
 
-         $this->registerTag( $name );
 
-     }
 
-     protected function registerTag( $method )
 
-     {
 
-         $this->blade->directive( $method, function ( $expression ) use ( $method ) {
 
-             return '<?php echo \Widget::' . $method . $expression . '; ?>';
 
-         } );
 
-     }
 
-     public function exists( $name )
 
-     {
 
-         return array_key_exists( $name, $this->widgets );
 
-     }
 
-     public function call( $name, array $parameters = array() )
 
-     {
 
-         if ( $this->groupExists( $name ) ) return $this->callGroup( $name, $parameters );
 
-         if ( $this->exists( $name ) ) {
 
-             $callback = $this->widgets[ $name ];
 
-             return $this->getCallback( $callback, $parameters );
 
-         }
 
-         return null;
 
-     }
 
-     public function attribute( $name, $attr )
 
-     {
 
-         if ( $this->exists( $name ) ) {
 
-             $name  = $this->widgets[ $name ];
 
-             $class = new \ReflectionClass( $name );
 
-             if ( $class->hasProperty( $attr ) ) {
 
-                 $properties = $class->getDefaultProperties();
 
-                 return $properties[ $attr ];
 
-             }
 
-         }
 
-         return null;
 
-     }
 
-     public function method( $name, $dataSource )
 
-     {
 
-         if ( $this->exists( $name ) ) {
 
-             $name     = $this->widgets[ $name ];
 
-             $class    = new \ReflectionClass( $name );
 
-             $instance = $class->newInstanceArgs();
 
-             return $instance->$dataSource();
 
-         }
 
-         return null;
 
-     }
 
-     public function view( $name, $dataSourceView )
 
-     {
 
-         $name = ucfirst( $name );
 
-         if ( $this->exists( $name ) ) {
 
-             $dataSourceView = dirname( __FILE__ ) . DIRECTORY_SEPARATOR . $name . DIRECTORY_SEPARATOR . 'View' . DIRECTORY_SEPARATOR . $dataSourceView;
 
-             /*// let's add /app/custom_views via namespace
 
-             view()->addNamespace( 'my_views', app_path( 'custom_views' ) );
 
-             view( 'my_views::some.view.name' ); // /app/custom_views/some/view/name.blade.php
 
-             // 或者
 
-             view()->addLocation( app_path( 'cutom_views' ) );
 
-             view( 'some.view.name' ); // search in /app/views first, then custom locations*/
 
-             view()->addNamespace( $name, dirname( $dataSourceView ) );
 
-             return View( $name . '::' . basename( $dataSourceView ) );
 
-         }
 
-     }
 
-     protected function getCallback( $callback, array $parameters )
 
-     {
 
-         if ( $callback instanceof Closure ) {
 
-             return $this->createCallableCallback( $callback, $parameters );
 
-         } elseif ( is_string( $callback ) ) {
 
-             return $this->createStringCallback( $callback, $parameters );
 
-         } else {
 
-             return null;
 
-         }
 
-     }
 
-     protected function createStringCallback( $callback, array $parameters )
 
-     {
 
-         if ( function_exists( $callback ) ) {
 
-             return $this->createCallableCallback( $callback, $parameters );
 
-         } else {
 
-             return $this->createClassCallback( $callback, $parameters );
 
-         }
 
-     }
 
-     protected function createCallableCallback( $callback, array $parameters )
 
-     {
 
-         return call_user_func_array( $callback, $parameters );
 
-     }
 
-     protected function createClassCallback( $callback, array $parameters )
 
-     {
 
-         list( $className, $method ) = Str::parseCallback( $callback, 'run' );
 
-         $instance = $this->container->make( $className );
 
-         $callable = array( $instance, $method );
 
-         return $this->createCallableCallback( $callable, $parameters );
 
-     }
 
-     public function group( $name, array $widgets )
 
-     {
 
-         $this->groups[ $name ] = $widgets;
 
-         $this->registerTag( $name );
 
-     }
 
-     public function groupExists( $name )
 
-     {
 
-         return array_key_exists( $name, $this->groups );
 
-     }
 
-     public function callGroup( $name, $parameters = array() )
 
-     {
 
-         if ( !$this->groupExists( $name ) ) return null;
 
-         $result = '';
 
-         foreach ( $this->groups[ $name ] as $key => $plugin ) {
 
-             $result .= $this->call( $plugin, array_get( $parameters, $key, array() ) );
 
-         }
 
-         return $result;
 
-     }
 
-     public function __call( $method, $parameters = array() )
 
-     {
 
-         return $this->call( $method, $parameters );
 
-     }
 
- }
 
 
  |