Browse Source

Merge pull request #1725 from lddtime/2.0

支持嵌套资源控制器 Nested Resources
Jiang Qinghua 3 years ago
parent
commit
8f95f27adc
1 changed files with 96 additions and 0 deletions
  1. 96 0
      src/Http/Controllers/HasNestedResource.php

+ 96 - 0
src/Http/Controllers/HasNestedResource.php

@@ -0,0 +1,96 @@
+<?php
+
+namespace Dcat\Admin\Http\Controllers;
+
+use Dcat\Admin\Layout\Content;
+
+trait HasNestedResource
+{
+    /**
+     * The id of the nested resource's child model.
+     *
+     * @var string|int
+     */
+    protected $nestedResourceId;
+
+    /**
+     * The parameter name for the nested resource's route.
+     *
+     * @var string
+     */
+    protected $routeParameterName;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function show($id, Content $content)
+    {
+        return parent::show($this->getNestedResourceId(), $content);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function edit($id, Content $content)
+    {
+        return parent::edit($this->getNestedResourceId(), $content);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update($id)
+    {
+        return parent::update($this->getNestedResourceId());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($id)
+    {
+        return parent::destroy($this->getNestedResourceId());
+    }
+
+    /**
+     * @return string|null
+     */
+    public function getNestedResourceId()
+    {
+        if ($this->nestedResourceId) {
+            return $this->nestedResourceId;
+        }
+
+        return $this->nestedResourceId = request($this->getRouteParameterName());
+    }
+
+    /**
+     * @param  string|int  $id
+     * @return void
+     */
+    public function setNestedResourceId($id)
+    {
+        $this->nestedResourceId = $id;
+    }
+
+    /**
+     * @return string
+     */
+    public function getRouteParameterName()
+    {
+        if ($this->routeParameterName) {
+            return $this->routeParameterName;
+        }
+
+        return $this->routeParameterName = last(request()->route()->parameterNames());
+    }
+
+    /**
+     * @param  string  $name
+     * @return void
+     */
+    public function setRouteParameterName($name)
+    {
+        $this->routeParameterName = (string) $name;
+    }
+}