I'm trying to access through localhost (Xampp) the index file from the folder in a Symfony project. Although i'm writing the following path it cannot find the page: http://localhost/google_analytics_app/consolytics-app/analytics/
tree-folder-structure
Following the instructions i use the base file in my index.html.twig file under the folder viwes/analytics/
{% extends 'base.html.twig' %}
and use my own index file under the folder/analytics/index.html.twig.
I also used annotations inside the src/AppBundle/Controller/IndexController.php :
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use AppBundle\Library\GoogleAnalytics;
use Doctrine\Common\Util\Debug as dump;
class IndexController extends Controller
{
/**
* #Route("/analytics/index", name="homepage")
*/
public function indexAction(Request $request)
{
....
return $this->render('index.html.twig');
}
}
When type the path it shows 404 error message. Can someone help with this routing issue? In my composer.json file:
"require": {
"twig/twig": "^1.0||^2.0"
},
The problem is that You didn't register your routings in routing.yml file.
You have to understand that annotations are describe routes, but your router component don't now anything about your routes before You register that one in routing.yml file. From this file (v3.4) router gets your routes.
https://symfony.com/doc/3.4/best_practices/controllers.html#routing-configuration
# app/config/routing.yml
app:
resource: '#AppBundle/Controller/'
type: annotation
Pay attantion for type parameter. Annotation says to router that your routes are actually annotations :)
Your param for the render-method is wrong. It has to be return
$this->render('views/analytics/index.html.twig');
I've already looked at other posts here, none of their solutions worked.
Tried prefixing "<\?php" to the file,
Tried change clearing the cache.
None have worked.
Working on a fresh install of Ubuntu 16.04.3 LTS.
Running within the NetBeans IDE
LuckyNumberController.php is below:
<?php
// src/AppBundle/Controller/LuckyController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
class LuckyController extends Controller
{
/**
* #Route("/lucky/number",name="lucky")
*/
public function numberAction()
{
$number = rand(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
Routing.yml below:
app:
resource: #AppBundle/Controller/
type: annotation
homepage:
path: /
defaults:
_controller: FrameworkBundle:Template:template
template: 'default/homepage.html.twig'
lucky:
path: /lucky/number
controller: App\Controller\LuckyController::numberAction
Actually both your declarations might be wrong.
Annotation
In your controller you're using
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
and according to documentation, it seems to be correct for Symfony <=3.3 but wrong for Symfony >=3.4 which should be
use Symfony\Component\Routing\Annotation\Route;.
Yaml
In your yaml file you're specifying
controller: App\Controller\LuckyController::numberAction
while actually your Controller's namespace is AppBundle\Controller; so your declaration should be
controller: AppBundle\Controller\LuckyController::numberAction
First of all, you don't need annotations routing and yml routing. You have to pick just one. I preferred yml version
Delete
...
/**
* #Route("/lucky/number",name="lucky")
*/
...
or you can delete this one
...
lucky:
path: /lucky/number
controller: App\Controller\LuckyController::numberAction
...
After that, it will work.
EDIT1:
If you are using Symfony 4 I recommended use yaml version (second one) because this one comes with (Symfony)
EDIT2:
I mean don't be confuse when you are creating new route.
I am quite new to Symfony 3. I created the controller files in the AppBundle itself. No new bundle created. Now I am trying to route a new page and it gives an error. This is what I did.
In src\AppBundle\Controller\Patient\PatientController.php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
class DefaultController extends Controller
{
/**
* #Route("/patient", name="patient_homepage")
*/
public function patientHomeAction(Request $request)
{
// replace this example code with whatever you need
return $this->render('Patient/home.html.twig', array()
);
}
In the app\Resources\views\base.html.twig
Home
This gives an error as
"An exception has been thrown during the rendering of a template
("Unable to generate a URL for the named route "patient_homepage" as
such route does not exist.") in base.html.twig at line 118."
Do I need to do any changes in the app\config\routing.yml also? What am I missing here.
Try this
app:
resource: "#AppBundle/Controller/"
type: annotation
You have to enable route in app/config/routing.yml
app:
resource: "#AppBundle/Controller/Patient/"
type: annotation
I'm working on Symfony 2.3 and I declared a new route and new controller, but when I call this controller from the browser I get this error:
The controller for URI "/user/1" is not callable. in /dev.mydomain.org/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php at line 82
This is my simple route configuration:
user_homepage:
pattern: /user
defaults: { _controller: UserBundle:Default:index }
user_show:
pattern: /user/{id}
defaults: { _controller: UserBundle:Default:show }
requirements:
id: \d+
And this is my very simple controller:
public function showUserAction($id)
{
return $this->render('UserBundle:Default:show.html.twig', array());
}
What is wrong?
The logical name UserBundle:Default:show refers to UserBunde\Controller\DefaultController::showAction you have a method called showUserAction.
Either change the method name to showAction or change the logical name to UserBundle:Default:showUser.
Although not relevant to the example given, this error can also be caused if the controller Action is not public
You're defining your controller function as showUserAction while in the definition your saying it is show[Action].
Either change your route configuration
user_show:
pattern: /user/{id}
defaults: { _controller: UserBundle:Default:showUser }
requirements:
id: \d+
or change your controller signature
public function showAction($id)
{
See if this helps
After big search, this worked for me:
1.- Create CRUDController
// src/Acme/DemoBundle/Controller/CRUDController.php
namespace Acme\DemoBundle\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Sonata\AdminBundle\Controller\CRUDController as Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Inter\PimeBundle\Entity\Empresa;
class CRUDController extends Controller
{
public function publicarAction($id)
{
//code here...
}
}
2.- Create the service
# app/config/config.yml
services:
ebtity.admin.service:
class: Acme\DemoBundle\Admin\EntityAdmin
tags:
- { name: sonata.admin, manager_type: orm, group: group, label: label }
arguments:
- NULL
- Acme\DemoBundle\Entity\Entity
- AcmeDemoBundle:EntityAdmin
3.- Create the template for the action button
{# src/Acme/DemoBundle/Resources/views/CRUD/list__action_publicar.html.twig #}
<a class="btn btn-sm" href="{{ admin.generateObjectUrl('publicar', object) }}">Publicar</a>
4.- Configure route
// src/Acme/DemoBundle/Admin/EntityAdmin.php
namespace Acme\DemoBundle\Admin;
// ...
use Sonata\AdminBundle\Route\RouteCollection;
class EntityAdmin extends Admin
{
// ...
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('name')
->add('engine')
->add('rescueEngine')
->add('createdAt')
->add('_action', 'actions', array(
'actions' => array(
'publicar' => array(
'template' => 'AcmeDemoBundle:CRUD:list__action_publicar.html.twig'
)
)
));
}
protected function configureRoutes(RouteCollection $collection)
{
$collection
->add('publicar',
$this->getRouterIdParameter().'/publicar',
array('_controller' => 'AcmeDemoBundle:CRUD:publicar')
);
}
}
5.- Clear cache
Hope it helps
Not the case here. But there is another related issue:
If you forget the 'Action' suffix all will work. But when you realized that you forget the suffix and then add it ... surprise! Same error as the OP.
The problem here is about caching
Symfony creates two file for caching urls:
AppDevUrlGenerator.php
AppDevUrlMatcher.php
If you change your action name (i.e. adding 'Action' suffix) then that cache info is obsolete.
Solution
php app/console cache:clear
Similar to the accepted answer, if your controller is defined as a service, e.g. (in YAML):
services:
user.default:
class: \UserBundle\DefaultController
And your route uses this controller service:
user_show:
pattern: /user/{id}
defaults: { _controller: user.default:showUserAction }
requirements:
id: \d+
Then it's necessary to name the action method in full including the Action suffix, otherwise you will get the "controller ... is not callable" error.
In my case, i was using symfony 2.
Prior version of symfony maintain method naming convention. Method suffix should contain Action word.
example:
in route yml file the method definition was
docudex_report_make_authorization:
pattern: /make-authorization
defaults: { _controller: DocudexReportBundle:Default:makeAuthorization }
and in the controller the method was
public function makeAuthorization(){}
therefore i was getting the error.
After changing the method name to public function makeAuthorizationAction it worked perfectly.
I would like to share my experience & how I solved it:
I was importing one bundle in an application whose routes were defined using annotations and they were importing fine in application too by using:
auth_bundle_routes:
# loads routes from the given routing file stored in some bundle
resource: '#XyzAuthBundle/Controller/'
type: annotation
But since my bundle controllers were defined using services, Symfony was showing error:
The controller for URI "/facebook/request-code" is not callable.
Controller Xyz\AuthBundle\Controller\FacebookController" has required
constructor arguments and does not exist in the container. Did you
forget to define such a service?
I updated my bundle for routing to use routing.yaml file over annotations and referring to controllers as service::method syntax and then this error is gone.
xyz_auth.facebook_request_code:
path: /facebook/request-code
controller: xyz_auth.controller.facebook_controller::requestCode
Bundle routes must be imported using
auth_bundle_routes:
resource: '#XyzAuthBundle/Resources/config/routing.yaml'
Hope this will save someone's time.
The same issue could happen if your env uses .env.local.php and new changes are added to env files without running composer dump-env
One of the reasons for this error is that you missed to add the word "Action" after the controller's method name. If you think that your routing is OK, check the method name.
in order to create a navigation for me webinterface I'd like to get a variable from the routing config of my bundle. I define the available pages in mybundle/Resources/config/routing.yml.
mybundle_homepage:
pattern: /{_locale}/{branch}/{page}
defaults: { _controller: mybundle:mycontroller:index, _locale: de, branch: x.x.x, page: start }
requirements:
_locale: de|en
page: start|functions|events|constants|styleguide
Now I had a look at the Symfony2 YAML Parser and I have to provide a filepath to it's static method parse: http://symfony.com/doc/2.0/reference/YAML.html
mycontroller.php
use Symfony\Component\Yaml\Yaml;
class mycontroller extends Controller
{
public function indexAction($_locale, $branch, $page)
{
$routing = Yaml::parse('../Resources/config/routing.yml');
var_dump($routing);
}
}
I thought I could do it that way because the folder hirarchy looks like that:
mybundle
Controller
mycontroller.php
Rescources
config
routing.yml
But it's not working. Any ideas or maybe another way to get the requirements.page array from the routing file?
Regards, Ben
You should be able to access the router service inside a class that's DI container aware. So, you can write something like:
$routes = $this->container->get('router')->getRouteCollection();
$route = $routes->get('my_route_name');
print_r($route->getRequirements());