【问题标题】:Symfony2 - Setting up service error with undefined getDoctrine()Symfony2 - 使用未定义的 getDoctrine() 设置服务错误
【发布时间】:2023-04-11 11:35:01
【问题描述】:

我正在尝试将搜索功能设置为服务。我的代码如下,提交搜索词时出现以下错误:

FatalErrorException:错误:调用 /var/www/html/Project/src/Acme/ProjectBundle/Services/Search.php 第 24 行中未定义的方法 Acme\ProjectBundle\Services\Search::getDoctrine()

我需要以某种方式注入教义吗?

config.yml

services:
    search:
    class: Acme\ProjectBundle\Services\Search
    arguments: ["@request_stack"]
    scope: request

IndexAction 控制器

$query = $this->get('search');
$results = $query->search();
return $this->render('AcmeProjectBundle:Default:index.html.twig, array(
    'query'  => $query,
    'results => $results,
));

搜索服务

class Search
{
private $request;

public function __construct(RequestStack $requestStack)
{
    $this->request = $requestStack->getCurrentRequest();
}

public function search()
{
    $results = null;
    $query = $this->request->query->get('q');

    if (!empty($query)) {
        $em = $this->getDoctrine()->getManager();


        $results = $em->createQueryBuilder()
            ->from('AcmeProjectBundle:Blog', 'b')
            ->select('b')
            ->where('b.title LIKE :search')
            ->setParameter(':search', "%${query}%")
            ->getQuery()
            ->getResult();
    }
//        exit(\Doctrine\Common\Util\Debug::dump($em));
    return array(
        'query'   => $query,
        'results' => $results,
    );
}
}

index.html.twig

{% block search %}
<form action="{{ path('acme_project_search') }}" method="GET">
    <label><input type="search" name="q" value={{ app.request.query.get('q') }}></label>
    <input type="submit" value="Search">
</form>
<br>
{% endblock %}

{% for result in query %}

    <div class="container">
    <div class="row">
        <div class="col-sm-8 blog-main">
            <div class="blog-post">

                <h2 class="blog-post-title">{{ result.title }}</h2>
                <p class="blog-post-meta"><time datetime="{{ result.created|date('c') }}">{{ result.created|date('l, F j, Y') }}</time> by <a href="#">{{ result.author }}</a></p>

                <p>{{ result.blog|truncate(350, true) }}</p><br>

                <div class="tags">
                    <p><strong>Tags: </strong><span class="highlight">{{ result.tags }}</span></p>
                </div>

            </div><!-- /.blog-post -->
        </div>
    </div>
</div>
{% endfor %}

【问题讨论】:

  • 参数:["@request_stack",@doctrine.orm.entity_manager]和类搜索__construct添加一个$em参数

标签: php symfony search service doctrine-orm


【解决方案1】:

是的,您需要“手动”注入教义。您的服务定义应如下所示:

services:
    search:
        class: Acme\ProjectBundle\Services\Search
        arguments: ["@request_stack", @doctrine]
        scope: request

你的构造函数应该是这样的:

use Doctrine\Bundle\DoctrineBundle\Registry;
public function __construct(RequestStack $requestStack, Registry $doctrine)
{
    $this->request = $requestStack->getCurrentRequest();
    $this->doctrine = $doctrine;
}

然后你可以在你的search 方法中使用它:

public function search()
{
    (...)
    $em = $this->doctrine->getManager()
}

注意:您尝试使用的 $this-&gt;getDoctrine() 方法是 Symfony\Bundle\FrameworkBundle\Controller 类的方法,您可能已经习惯从控制器中使用它,但您自己的服务需要注入 doctrine 作为一个依赖

【讨论】:

  • 感谢您的深入解释。这解决了错误,但现在遇到了(无法在第 31 行的 AcmeProjectBundle:Default:search.html.twig 中访问字符串变量(“practice”)上的属性(“title”))——“practice”是我正在寻找的标题之一的搜索词。我的查询需要在搜索类中更改吗?
  • 如果不看更多代码就很难判断。您不需要: 登录您的 setParameter 调用,也许是这种情况。
  • 这是我原作的延续问题,仍未解决:stackoverflow.com/questions/22796723/…
  • By : 你的意思是不使用 ->setParameter(':search', "%${query}%") ?
  • 是的,你可以这样做 ->setParameter('search', "%${query}%") 但这是相当盲目的
【解决方案2】:

您需要让容器将EntityManager 注入到您的服务中。

services:
    search:
    class: Acme\ProjectBundle\Services\Search
    arguments: ["@request_stack","@doctrine.orm.entity_manager"]
    scope: request

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    相关资源
    最近更新 更多