从 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 许可下获得许可。