跳到内容

从 CRUDController 解耦

编辑此页

当创建自定义操作时,我们可以创建不继承 CRUDController 的控制器。我们通常需要访问与操作关联的 admin 实例,为此我们可以类型提示 admin 类或使用 AdminFetcherInterface 服务。

您可以将您的 Admin 作为操作的参数添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// src/Controller/CarAdminController.php

namespace App\Controller;

use Symfony\Component\HttpFoundation\RedirectResponse;

final class CarAdminController
{
    public function clone(CarAdmin $admin, Request $request)
    {
        $object = $admin->getSubject();

        // ...

        $request->getSession()->getFlashBag()->add('sonata_flash_success', 'Cloned successfully');

        return new RedirectResponse($admin->generateUrl('list'));
    }
}

或者如果您有一个用于**所有** admin 的可重用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// src/Controller/CarAdminController.php

namespace App\Controller;

use Sonata\AdminBundle\Admin\AdminInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;

final class CloneAdminController
{
    public function clone(AdminInterface $admin, Request $request)
    {
        $object = $admin->getSubject();

        // ...

        $request->getSession()->getFlashBag()->add('sonata_flash_success', 'Cloned successfully');

        return new RedirectResponse($admin->generateUrl('list'));
    }
}

或者您可以使用 AdminFetcherInterface 服务从请求中获取 admin,在此示例中,我们将控制器转换为可调用对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// src/Controller/CarAdminController.php

namespace App\Controller;

use Symfony\Component\HttpFoundation\RedirectResponse;

final class CarAdminSoldAction
{
    private AdminFetcherInterface $adminFetcher;

    public function __construct(AdminFetcherInterface $adminFetcher)
    {
        $this->adminFetcher = $adminFetcher;
    }

    public function __invoke(Request $request)
    {
        $admin = $this->adminFetcher->get($request);

        $object = $admin->getSubject();

        // ...

        $request->getSession()->getFlashBag()->add('sonata_flash_success', 'Sold successfully');

        return new RedirectResponse($admin->generateUrl('list'));
    }
}

现在我们只需要在 configureRoutes 中添加新路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use App\Controller\CarAdminCloneAction;
use Sonata\AdminBundle\Route\RouteCollectionInterface;

protected function configureRoutes(RouteCollectionInterface $collection)
{
    $collection
        ->add('clone', $this->getRouterIdParameter().'/clone', [
            '_controller' => 'App\Controller\CarAdminController::clone',
        ])

        // Using invokable controller:
        ->add('sold', $this->getRouterIdParameter().'/sold', [
            '_controller' => CarAdminSoldAction::class,
        ]);
}
这项工作,包括代码示例,在 Creative Commons BY-SA 3.0 许可下获得许可。
目录
    版本