OK、それで、現在ログインしているユーザーを ProductRepository のカスタム メソッドに送信して、このユーザーに割り当てられている製品の製品をフィルター処理したいと思います。製品のリストへの私の product.yml ルート:
sylius_backend_product_index:
pattern: /
methods: [GET]
defaults:
_controller: sylius.controller.product:indexAction
_sylius:
template: SyliusWebBundle:Backend/Product:index.html.twig
method: createFilterPaginator2
arguments: [$criteria, $sorting, $deleted, $user]
次にコントローラーに移動します。ProductController には indexAction メソッドがありませんが、その拡張機能である ResourceController には index アクションがあります。
public function indexAction(Request $request)
{
$criteria = $this->config->getCriteria();
$sorting = $this->config->getSorting();
$user = $this->get('security.context')->getToken()->getUser();
$repository = $this->getRepository();
if ($this->config->isPaginated()) {
$resources = $this->resourceResolver->getResource(
$repository,
'createFilterPaginator2',
array($criteria, $sorting, false, $user)
);
$resources->setCurrentPage($request->get('page', 1), true, true);
$resources->setMaxPerPage($this->config->getPaginationMaxPerPage());
if ($this->config->isApiRequest()) {
$resources = $this->getPagerfantaFactory()->createRepresentation(
$resources,
new Route(
$request->attributes->get('_route'),
$request->attributes->get('_route_params')
)
);
}
} else {
$resources = $this->resourceResolver->getResource(
$repository,
'findBy',
array($criteria, $sorting, $this->config->getLimit(), $user)
);
}
$view = $this
->view()
->setTemplate($this->config->getTemplate('index.html'))
->setTemplateVar($this->config->getPluralResourceName())
->setData($resources)
;
return $this->handleView($view);
}
ここで私は追加しました
$user = $this->get('security.context')->getToken()->getUser();
次に、$user を $resources のパラメーター配列に追加しました。createFilterPaginator2 メソッド自体は次のようになります。
public function createFilterPaginator2($criteria = array(), $sorting = array(), $deleted = false, UserInterface $user = NULL)
{
$queryBuilder = parent::getCollectionQueryBuilder()
->select('product, variant')
->leftJoin('product.variants', 'variant')
->where('product.seller = :user')
->setParameter('user', $user)
;
//var_dump($user->getUsername());
if (!empty($criteria['name'])) {
$queryBuilder
->andWhere('product.name LIKE :name')
->setParameter('name', '%'.$criteria['name'].'%')
;
}
if (!empty($criteria['sku'])) {
$queryBuilder
->andWhere('variant.sku = :sku')
->setParameter('sku', $criteria['sku'])
;
}
if (empty($sorting)) {
if (!is_array($sorting)) {
$sorting = array();
}
$sorting['updatedAt'] = 'desc';
}
$this->applySorting($queryBuilder, $sorting);
if ($deleted) {
$this->_em->getFilters()->disable('softdeleteable');
}
return $this->getPaginator($queryBuilder);
}
そして問題は、ResourceController で $user が現在ログインしているユーザーを正しく返しますが、$user がメソッドに正常に送信されないことです。私は重要な sth を見逃していると思います.引数: [$criteria, $sorting, $deleted, $user] は ResourceController によって返されるべきではないと思いますが、atm.
カスタムリポジトリメソッド、便利なリンクなどにパラメータを送信する方法について、助けていただければ幸いです。ありがとう!