Php Symfony2-使用未定义的getDoctrine()设置服务错误
我正在尝试将搜索功能设置为服务。我的代码如下,提交搜索词时出现以下错误: FatalErrorException:错误:调用/var/www/html/Project/src/Acme/ProjectBundle/Services/Search.php第24行中未定义的方法Acme\ProjectBundle\Services\Search::getdoctor() 我需要注入教义吗 config.ymlPhp Symfony2-使用未定义的getDoctrine()设置服务错误,php,symfony,search,service,doctrine-orm,Php,Symfony,Search,Service,Doctrine Orm,我正在尝试将搜索功能设置为服务。我的代码如下,提交搜索词时出现以下错误: FatalErrorException:错误:调用/var/www/html/Project/src/Acme/ProjectBundle/Services/Search.php第24行中未定义的方法Acme\ProjectBundle\Services\Search::getdoctor() 我需要注入教义吗 config.yml services: search: class: Acme\Project
services:
search:
class: Acme\ProjectBundle\Services\Search
arguments: ["@request_stack"]
scope: request
索引控制器
$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 %}
{%block search%}
{%endblock%}
{查询%中的结果为%0}
{{result.title}
{{result.created | date('l,fj,Y')}由
{{result.blog | truncate(350,true)}
标记:{{result.Tags}
{%endfor%}
是的,您需要“手动”注入条令。您的服务定义应该如下所示:
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;
}
您的构造函数应该如下所示:
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;
}
然后您可以在搜索方法中使用它:
public function search()
{
(...)
$em = $this->doctrine->getManager()
}
注意:$this->getDoctrine()
您尝试使用的方法是Symfony\Bundle\FrameworkBundle\Controller
类的方法,您可能已经习惯了从控制器使用它,但是您需要将原则
作为依赖项注入您自己的服务您需要使容器将实体管理器
注入到您的服务中
services:
search:
class: Acme\ProjectBundle\Services\Search
arguments: ["@request_stack","@doctrine.orm.entity_manager"]
scope: request
参数:[“@request\u stack”、@doctrine.orm.entity\u manager]和class search\u构造添加$em参数谢谢您的深入解释。这解决了错误,但现在遇到了(无法访问AcmeProjectBundle中字符串变量(“practice”)的属性(“title”):默认值:search.html.twig,在第31行)--“practice”是我正在查找的标题之一的搜索词。我的查询是否需要在搜索类中更改?如果没有看到更多代码,很难判断。你不需要:
在你的setParameter调用中签名,也许是这样。这是我的原始版本中尚未解决的继续问题:By:你的意思是不使用->setParameter(“:
search',“%$${query}%”)?是的,你可以做->setParameter('search',“%$${query}%”),但这是相当盲目的