/** * Get the evaluated view contents for the given view. * * @param string $view * @param array $data * @param array $mergeData * @return \Illuminate\Contracts\View\View */ public function make($view, $data = [], $mergeData = []) {// Get the evaluated view contents for the given view. if (isset($this->aliases[$view])) { $view = $this->aliases[$view]; }// if isset this alias view , set it $view = $this->normalizeName($view);// get the normal name $path = $this->finder->find($view);// get the view path $data = array_merge($mergeData, $this->parseData($data));// get the data $this->callCreator($view = new View($this, $this->getEngineFromPath($path), $view, $path, $data)); // call Creator make it return $view;// return it, in this way } /** * Normalize a view name. * * @param string $name * @return string */ protected function normalizeName($name) {//normalizeName a view name. $delimiter = ViewFinderInterface::HINT_PATH_DELIMITER;// set the delimiter if (strpos($name, $delimiter) === false) { return str_replace(‘/‘, ‘.‘, $name); } // str replace this default delimiter list($namespace, $name) = explode($delimiter, $name);// get the namespace and name return $namespace.$delimiter.str_replace(‘/‘, ‘.‘, $name);// first it is delimiter // } /** * Parse the given data into a raw array. * * @param mixed $data * @return array */ protected function parseData($data) { return $data instanceof Arrayable ? $data->toArray() : $data; }// parse the given data into a raw array. // maybe it is a not good type /** * Get the evaluated view contents for a named view. * * @param string $view * @param mixed $data * @return \Illuminate\Contracts\View\View */ public function of($view, $data = []) { return $this->make($this->names[$view], $data); }//return make /** * Register a named view. * * @param string $view * @param string $name * @return void */ public function name($view, $name) { $this->names[$name] = $view; }// register a named view. /** * Add an alias for a view. * * @param string $view * @param string $alias * @return void */ public function alias($view, $alias) { $this->aliases[$alias] = $view; }//alias set it /** * Determine if a given view exists. * * @param string $view * @return bool */ public function exists($view) { try { $this->finder->find($view); } catch (InvalidArgumentException $e) { return false; } return true; }// Determine if a given view exists. /** * Get the rendered contents of a partial from a loop. * * @param string $view * @param array $data * @param string $iterator * @param string $empty * @return string */ public function renderEach($view, $data, $iterator, $empty = ‘raw|‘) {// Get the rendered contents of a partial from a loop $result = ‘‘;// set the result store. // If is actually data in the array, we will loop through the data and append // an instance of the partial view to the final result HTML passing in the // iterated value of this data array, allowing the views to access them. if (count($data) > 0) { foreach ($data as $key => $value) { $data = [‘key‘ => $key, $iterator => $value]; $result .= $this->make($view, $data)->render(); } }// if is actually data in the array. we will loop through the data and append // an instance of the partial view to the final result HTML passing in the // iterated value of this data array, allowing the views to access them. // If there is no data in the array, we will render the contents of the empty // view. Alternatively, the "empty view" could be a raw string that begins // with "raw|" for convenience and to let this know that it is a string. else { if (Str::startsWith($empty, ‘raw|‘)) { $result = substr($empty, 4); } else { $result = $this->make($empty)->render(); } }// if there is no data in the array, we will render the contents of the empty // view. Alternatively, the "empty view" could be a raw string that beings // with "raw" for convenience and to let this know that it is a string. return $result; }// this result /** * Get the appropriate view engine for the given path. * * @param string $path * @return \Illuminate\View\Engines\EngineInterface * * @throws \InvalidArgumentException */ public function getEngineFromPath($path) {// Get the appropriate view engine for the given path. if (! $extension = $this->getExtension($path)) { throw new InvalidArgumentException("Unrecognized extension in file: $path"); }//get the appropriate $engine = $this->extensions[$extension];// get engine return $this->engines->resolve($engine);// engines } /** * Get the extension used by the view file. * * @param string $path * @return string */ protected function getExtension($path) {// get Extension $extensions = array_keys($this->extensions); // extensions get the array_keys return Arr::first($extensions, function ($key, $value) use ($path) { return Str::endsWith($path, $value); });// Arr::first }// Get the extension used by the view file. /** * Add a piece of shared data to the environment. * * @param array|string $key * @param mixed $value * @return mixed */ public function share($key, $value = null) {// Add a piece of shared data to the environment if (! is_array($key)) {// no array return $this->shared[$key] = $value; } foreach ($key as $innerKey => $innerValue) {// loop this innerKey $this->share($innerKey, $innerValue); }// loop this share array } /** * Register a view creator event. * * @param array|string $views * @param \Closure|string $callback * @return array */ public function creator($views, $callback) {// register a view creator event. $creators = [];// set the creator foreach ((array) $views as $view) {//loop this views $creators[] = $this->addViewEvent($view, $callback, ‘creating: ‘); }// set the creators return $creators;// creators } /** * Register multiple view composers via an array. * * @param array $composers * @return array */ public function composers(array $composers) {// register multiple view composers via an array. $registered = [];// registered foreach ($composers as $callback => $views) {// loop this composers $registered = array_merge($registered, $this->composer($views, $callback)); } return $registered; }//return this registered // a big wrap function /** * Register a view composer event. * * @param array|string $views * @param \Closure|string $callback * @param int|null $priority * @return array */ public function composer($views, $callback, $priority = null) { $composers = []; foreach ((array) $views as $view) { $composers[] = $this->addViewEvent($view, $callback, ‘composing: ‘, $priority); } return $composers; }// a composer /** * Add an event for a given view. * * @param string $view * @param \Closure|string $callback * @param string $prefix * @param int|null $priority * @return \Closure|null */ protected function addViewEvent($view, $callback, $prefix = ‘composing: ‘, $priority = null) {//Add an event for a given view. $view = $this->normalizeName($view);// get view if ($callback instanceof Closure) {// Closure is a system function $this->addEventListener($prefix.$view, $callback, $priority); return $callback; } elseif (is_string($callback)) { return $this->addClassEvent($view, $callback, $prefix, $priority); } }// two type way /** * Register a class based view composer. * * @param string $view * @param string $class * @param string $prefix * @param int|null $priority * @return \Closure */ protected function addClassEvent($view, $class, $prefix, $priority = null) {// Register a class based view composer $name = $prefix.$view;// name prefix.view // When registering a class based view "composer", we will simply resolve the // classes from the application IoC container then call the compose method // on the instance. This allows for convenient, testable view composers. $callback = $this->buildClassEventCallback($class, $prefix); // when registering a class based view "composer", we will simply resolve the // classes from the application IoC container then call the compose method // on the instance.This allows for convenient, testable view composers. $this->addEventListener($name, $callback, $priority);// add Event Listener return $callback;// call back } /** * Add a listener to the event dispatcher. * * @param string $name * @param \Closure $callback * @param int|null $priority * @return void */ protected function addEventListener($name, $callback, $priority = null) {//Add a listener to the event dispatcher if (is_null($priority)) {//null $this->events->listen($name, $callback); } else {// listen $this->events->listen($name, $callback, $priority); } } /** * Build a class based container callback Closure. * * @param string $class * @param string $prefix * @return \Closure */ protected function buildClassEventCallback($class, $prefix) {//Build a class based container callback Closure. list($class, $method) = $this->parseClassEvent($class, $prefix); // Once we have the class and method name, we can build the Closure to resolve // the instance out of the IoC container and call the method on it with the // given arguments that are passed to the Closure as the composer‘s data. return function () use ($class, $method) { $callable = [$this->container->make($class), $method]; return call_user_func_array($callable, func_get_args()); };// Once we have the class and method name, we can build the Closure to resolve // the instance out of the IoC container and call the method on it with the // given arguments that are passed to the Closure as the composer‘s data }
时间: 2024-11-05 02:17:28