【问题标题】:Laravel Nova - How to determine the view (index, detail, form) you are in for a resource's computed field?Laravel Nova - 如何确定资源计算字段的视图(索引、详细信息、表单)?
【发布时间】:2019-05-11 05:28:58
【问题描述】:

我想在查看索引视图时为计算字段返回不同的结果,而不是查看资源的详细视图时。

基本上类似于下面的 viewIs():

Text::make('Preview', function () {
    if($this->viewIs('index'){
        return \small_preview($this->image);
    }
    return \large_preview($this->image);
 })->asHtml(),

【问题讨论】:

    标签: laravel-nova computed-field


    【解决方案1】:

    有点晚了,但是嘿!您可以检查NovaRequest 属性editingeditMode(“创建”、“更新”、“附加”等)

    // Determine if you are creating a model. 
    $request->editMode == 'create';
    

    或者正如他们所说,“阅读源卢克”,看看他们是如何确定的。请参阅Laravel\Nova\Http\Requests\NovaRequest,它包含类似的检查。

    namespace Laravel\Nova\Http\Requests;
    
    class NovaRequest extends FormRequest
    {
        /**
         * Determine if this request is via a many to many relationship.
         *
         * @return bool
         */
        public function viaManyToMany();
    
        /**
         * Determine if this request is an attach or create request.
         *
         * @return bool
         */
        public function isCreateOrAttachRequest();
    
        /**
         * Determine if this request is an update or update-attached request.
         *
         * @return bool
         */
        public function isUpdateOrUpdateAttachedRequest();
    
        /**
         * Determine if this request is a resource index request.
         *
         * @return bool
         */
        public function isResourceIndexRequest();
    
        /**
         * Determine if this request is a resource detail request.
         *
         * @return bool
         */
        public function isResourceDetailRequest();
    
        /**
         * Determine if this request is an action request.
         *
         * @return bool
         */
        public function isActionRequest();
    }
    

    如果您可以在 Nova 资源 fields() 方法中键入提示 NovaRequest 而不是常规提示,那就太好了,但由于父资源正在扩展,因此不允许这样做。

    【讨论】:

      【解决方案2】:

      我添加了这个小助手类

      namespace App\Helpers;
      
      class CurrentResourceAction {
          public static function isIndex($request)
          {
              return $request instanceof \Laravel\Nova\Http\Requests\ResourceIndexRequest;
          }
          public static function isDetail($request)
          {
              return $request instanceof \Laravel\Nova\Http\Requests\ResourceDetailRequest;
          }
          public static function isCreate($request)
          {
              return $request instanceof \Laravel\Nova\Http\Requests\NovaRequest &&
                  $request->editMode === 'create';
          }
          public static function isUpdate($request)
          {
              return $request instanceof \Laravel\Nova\Http\Requests\NovaRequest &&
                  $request->editMode === 'update';
          }
      }
      

      你可以在任何你需要的地方调用它

      【讨论】:

        【解决方案3】:

        NovaRequest 类很快就能提供帮助,因为 isResourceIndexRequestisResourceDetailRequest 已经在 master 中了。

        由于 Nova 存储库是私有的,我会及时通知您,什么时候可以使用。

        与此同时,我正在使用 Nova Resource 类 (app/Nova/Resource.php) 上的辅助方法:

        namespace App\Nova;
        
        use Laravel\Nova\Http\Requests\ResourceDetailRequest;
        use Laravel\Nova\Http\Requests\ResourceIndexRequest;
        use Laravel\Nova\Resource as NovaResource;
        use Laravel\Nova\Http\Requests\NovaRequest;
        
        abstract class Resource extends NovaResource
        {
            // [...]
        
            /**
             * Determine if this request is a resource index request.
             *
             * @return bool
             */
            public function isResourceIndexRequest($request)
            {
                return $request instanceof ResourceIndexRequest;
            }
        
            /**
             * Determine if this request is a resource detail request.
             *
             * @return bool
             */
            public function isResourceDetailRequest($request)
            {
                return $request instanceof ResourceDetailRequest;
            }
        }
        

        用法:

        public function fields(Request $request)
        {
            $fields = [
                // [...]
            ];
        
            if ($this->isResourceDetailRequest($request)) {
                if ($this->isResourceDetailRequest($request)) {
                    $fields = array_merge($fields, [
                        // [...]
                    ]);
                }
            }
        
            return $fields;
        }
        

        【讨论】:

          【解决方案4】:

          您可以查看请求的类别:

          Text::make('Preview', function () use ($request) {
              if ($request instanceof \Laravel\Nova\Http\Requests\ResourceDetailRequest) {
                  return \large_preview($this->image);
              }
          
              return \small_preview($this->image);
          });
          

          否则,您可以创建自己的 viewIs 函数:

          // app/Nova/Resource.php
          
          /**
           * Check the current view.
           *
           * @param  string  $view
           * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
           * @retrun bool
           */
          public function viewIs($view, $request)
          {
              $class = '\Laravel\Nova\Http\Requests\\Resource'.ucfirst($view).'Request';
          
              return $request instanceof $class;
          }
          

          那么你可以这样:

          Text::make('Preview', function () use ($request) {
              if ($this->viewIs('detail', $request) {
                  return \large_preview($this->image);
              }
          
              return \small_preview($this->image);
          });
          

          【讨论】:

            【解决方案5】:

            不幸的是,@Chin 的回答对我不起作用,因为编辑视图请求类只是一个基本的Laravel\Nova\Http\Request 类。

            我检查这是否是索引视图的解决方法如下:

            /**
             * Check if the current view is an index view.
             *
             * @param  \Laravel\Nova\Http\Requests\NovaRequest $request
             * @return bool
             */
            public function isIndex($request)
            {
                return $request->resourceId === null;
            }
            

            【讨论】:

              【解决方案6】:

              您可以为索引和详细信息页面创建两个单独的字段。

              // ----- For Index page
              Text::make('Preview', function () {
                  return \small_preview($this->image);
              })
              ->onlyOnIndex()
              ->asHtml(),
              
              // ----- For Detail page
              Text::make('Preview', function () {
                  return \large_preview($this->image);
              })
              ->onlyOnDetail()
              ->asHtml(),
              

              【讨论】:

                猜你喜欢
                • 2019-02-14
                • 1970-01-01
                • 1970-01-01
                • 2017-07-02
                • 1970-01-01
                • 1970-01-01
                • 2015-12-10
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多