Routes, Controllers, Pages, oh my!

Let's create our first page! Actually, this is the main job of a framework: to give you a route and controller system. A route is configuration that defines the URL for a page and a controller is a function that we write that actually builds the content for that page.

And right now... our app is really small! Instead of weighing down your project with every possible feature you could ever need - after all, we're not in zero-gravity yet - a Symfony app is basically just a small route-controller system. Later, we'll install more features when we need them, like a warp drive! Those always come in handy. Adding more features is actually going to be pretty awesome. More on that later.

First Route & Controller

Open your app's main routing file: config/routes.yaml:

#index:
# path: /
# controller: App\Controller\DefaultController::index

Hey! We already have an example! Uncomment that. Ignore the index key for now: that's the internal name of the route, but it's not important yet.

This says that when someone goes to the homepage - / - Symfony should execute an index() method in a DefaultController class. Change this to ArticleController and the method to homepage:

index:
path: /
controller: App\Controller\ArticleController::homepage

And... yea! That's a route! Hi route! It defines the URL and tells Symfony what controller function to execute.

The controller class doesn't exist yet, so let's create it! Right-click on the Controller directory and go to "New" or press Cmd+N on a Mac. Choose "PHP Class". And, yes! Remember that Composer setup we did in Preferences? Thanks to that, PhpStorm correctly guesses the namespace! The force is strong with this one... The namespace for every class in src/ should be App plus whatever sub-directory it's in.

Name this ArticleController:

<?php
namespace App\Controller;
... lines 4 - 6
class ArticleController
{
... lines 9 - 12
}

And inside, add public function homepage():

... lines 1 - 2
namespace App\Controller;
... lines 4 - 6
class ArticleController
{
public function homepage()
{
... line 11
}
}

This function is the controller... and it's our place to build the page. To be more confusing, it's also called an "action", or "ghob" to its Klingon friends.

Anyways, we can do whatever we want here: make database queries, API calls, take soil samples looking for organic materials or render a template. There's just one rule: a controller must return a Symfony Response object.

So let's say: return new Response(): we want the one from HttpFoundation. Give it a calm message: OMG! My first page already! WOOO!:

... lines 1 - 2
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class ArticleController
{
public function homepage()
{
return new Response('OMG! My first page already! WOOO!');
}
}

Ahem. Oh, and check this out: when I let PhpStorm auto-complete the Response class it added this use statement to the top of the file automatically:

... lines 1 - 4
use Symfony\Component\HttpFoundation\Response;
... lines 6 - 14

You'll see me do that a lot. Good job Storm!

Let's try the page! Find your browser. Oh, this "Welcome" page only shows if you don't have any routes configured. Refresh! Yes! This is our page. Our first of many.

Annotation Routes

That was pretty easy, but it can be easier! Instead of creating our routes in YAML, let's use a cool feature called annotations. This is an extra feature, so we need to install it. Find your open terminal and run:

composer require annotations

Interesting... this annotations package actually installed sensio/framework-extra-bundle. We're going to talk about how that works very soon.

Now, about these annotation routes. Comment-out the YAML route:

#index:
# path: /
# controller: App\Controller\ArticleController::homepage

Then, in ArticleController, above the controller method, add /**, hit enter, clear this out, and say @Route(). You can use either class - but make sure PhpStorm adds the use statement on top. Then add "/":

... lines 1 - 4
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
... lines 6 - 7
class ArticleController
{
/**
* @Route("/")
*/
public function homepage()
{
... line 15
}
}

That's it! The route is defined right above the controller, which is why I love annotation routes: everything is in one place. But don't trust me, find your browser and refresh. It's a traaaap! I mean, it works!

Tip

What exactly are annotations? They're PHP comments that are read as configuration.

Fancy Wildcard Routes

So what else can we do with routes? Create another public function called show(). I want this page to eventually display a full article. Give it a route: @Route("/news/why-asteroids-taste-like-bacon"):

... lines 1 - 4
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
... lines 6 - 7
class ArticleController
{
... lines 10 - 17
/**
* @Route("/news/why-asteroids-taste-like-bacon")
*/
public function show()
{
... line 23
}
}

Eventually, this is how we want our URLs to look. This is called a "slug", it's a URL version of the title. As usual, return a new Response('Future page to show one space article!'):

... lines 1 - 4
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
class ArticleController
{
... lines 10 - 17
/**
* @Route("/news/why-asteroids-taste-like-bacon")
*/
public function show()
{
return new Response('Future page to show one space article!');
}
}

Perfect! Copy that URL and try it in your browser. It works... but this sucks! I don't want to build a route and controller for every single article that lives in the database. Nope, we need a route that can match /news/ anything. How? Use {slug}:

... lines 1 - 7
class ArticleController
{
... lines 10 - 17
/**
* @Route("/news/{slug}")
*/
public function show($slug)
{
... lines 23 - 26
}
}

This route now matches /news/ anything: that {slug} is a wildcard. Oh, and the name slug could be anything. But whatever you choose now becomes available as an argument to your "ghob", I mean your action.

So let's refactor our success message to say:

Future page to show the article

And then that slug:

... lines 1 - 7
class ArticleController
{
... lines 10 - 17
/**
* @Route("/news/{slug}")
*/
public function show($slug)
{
return new Response(sprintf(
'Future page to show the article: "%s"',
$slug
));
}
}

Try it! Refresh the same URL. Yes! It matches the route and the slug prints! Change it to something else: /why-asteroids-taste-like-tacos. So delicious! Go back to bacon... because... ya know... everyone knows that's what asteroids really taste like.

And... yes! We're 3 chapters in and you now know the first half of Symfony: the route & controller system. Sure, you can do fancier things with routes, like match regular expressions, HTTP methods or host names - but that will all be pretty easy for you now.

It's time to move on to something really important: it's time to learn about Symfony Flex and the recipe system. Yum!

Leave a comment!

  • 2018-12-12 Victor Bocharsky

    Haha, probably so... thanks! ;)

    Cheers!

  • 2018-12-11 weaverryan

    Hey yao!

    Yep, that's totally ok :). When I recorded this tutorial, that package downloaded 6 things. But a few months ago, one of the packages was removed (nothing too important) and so now you only get 5.

    Cheers!

  • 2018-12-11 yao

    Is it normal that the debug pack just has 5 symfony plugins instead of 6 ? bc in the tutorial he said it comes with 6.

  • 2018-12-11 yao

    So that means you are senior right now... Great job

  • 2018-12-10 Victor Bocharsky

    Hey Yao,

    Hm, I personally started to get familiar with Symfony since 2.1, but mostly started developing apps since 2.3 IIRC :)

    Cheers!

  • 2018-12-10 yao

    How long do you use Symfony for developing apps ?

  • 2018-12-10 Victor Bocharsky

    Yay, glad you had got it working before even we replied you. And yeah, it was an easy fix ;)

    Cheers!

  • 2018-12-10 yao

    Hi Victor,

    Nice to read you. Yeah i finally fixed my issue by replacing "Sensio\Bundle\FrameworkExtraBundle\Configuration\Route" with "Symfony\Component\Routing\Annotation\Route" class which is really cool.

    Thanks for your assistance.

  • 2018-12-10 Victor Bocharsky

    Hey Yao,

    I see you noticed this comment: https://symfonycasts.com/sc... - great, and I suppose your problem is solved. So basically, "Symfony\Component\Routing\Annotation\Route" class is a new official way to add routes annotations instead of deprecated "Sensio\Bundle\FrameworkExtraBundle\Configuration\Route" one. But instead of providing a BC break, Symfony warn us first saying it will be removed in future releases so you have time to update your code.

    Cheers!

  • 2018-12-09 yao

    Thanks Mike it works.

  • 2018-12-09 yao

    Hi guys , I am a new beginner on this course. And i already face some issues.

    someone can help me with this please.

    After adding

    /**
    * @Route("/")
    */

    I have this path but !!!!!!!
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

    the last word Route is crossing. And it says that Class Route is depreciated

    thank you!

  • 2018-11-10 Hunter Baba

    I got the solution i have not added this - "use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    ".
    added and result came

  • 2018-11-10 Hunter Baba

    When i run composer require annotations its not installing and configuring these things and when i write annotations in controller its not working. HELP ASAP. In my composer.json file "sensio/framework-extra-bundle": "^5.2", is there

  • 2018-11-08 Advocatus Kakorozya

    Thank you so much! noted that

  • 2018-11-07 Diego Aguiar

    In yaml the identation matters. If you have a key idented one level further, then that key is related to its parent (the key above it)

    Probably this post may help you out understanding the syntax: https://www.codeproject.com...

    Cheers!

  • 2018-11-07 Advocatus Kakorozya

    I have just fixed just by re-doing the process on the router.yaml but still my eyes can't spot the difference

  • 2018-11-07 Advocatus Kakorozya

    Thank youi @DiDiego Aguiar
    Yes, I changed it according to the tutorial above as follows

    index:
    path: /

    controller: App\Controller\ArticleController::homepage

  • 2018-11-06 Diego Aguiar

    Hey Advocatus Kakorozya

    Welcome to the Symfony world!

    It means that you have a syntax error in your "config/routes.yaml" file. Did you change it? Could you show it to me?

    Cheers!

  • 2018-11-06 Advocatus Kakorozya

    Hello,
    I am new to symfony and PHPStorm
    I am running my first project using "php bin/console server:run" whereby the server is running fine
    The problem come when I create router.yaml and ArticleController as per the tutorial above, when I refresh the page I get the following error

    (7/7) Twig_Error_Runtime
    An exception has been thrown during the rendering of a template ("The file "C:\wamp64\www\my_project\config/routes.yaml" does not contain valid YAML in C:\wamp64\www\my_project\config/routes.yaml (which is loaded in resource "C:\wamp64\www\my_project\config/routes.yaml").").

    What could be the problem here?

  • 2018-10-31 Hichem Touati

    nvm the yaml routes were commented out. fixed it

  • 2018-10-31 Hichem Touati

    For some reason the page is not changing. And i have no idea what the problem could be.

  • 2018-10-29 weaverryan

    Hi Simone Martinucci!

    Welcome to Symfony! :)

    When you go to /new/prova, what does the error look like? Is it a nice, beautiful "Not found found" Symfony error? Or an ugly, white error with black text? A screenshot would be IDEAL!

    Also, can you post your code? What does your route & controller look like? Are you using the built-in php web server like we suggest (by running php bin/console server:run) or something like Apache or Nginx?

    Let us know and we'll do our best to help!

    Cheers!

  • 2018-10-29 Simone Martinucci

    Hello! I'm new beginner in symfony, i wrote this code:

    but when i go to type in the browser the url /news/prova return a 404 error ... can you help me please??

  • 2018-09-27 Diego Aguiar

    Hey @Ganda

    Looks like this file "your-app/config/routes.yaml" contains invalid YAML code. Could you double check it?

    Cheers!

  • 2018-09-27 Ganda Magassa

    I'm a beginner in symfony ,
    I try to run this command : composer require annotations
    But i have this error

    ~/app-synfony$ composer require annotations
    Using version ^5.2 for sensio/framework-extra-bundle
    ./composer.json has been updated
    Loading composer repositories with package information
    Updating dependencies (including require-dev)
    Restricting packages listed in "symfony/symfony" to "4.1.*"
    Nothing to install or update
    Generating autoload files
    ocramius/package-versions: Generating version class...
    ocramius/package-versions: ...done generating version class
    Executing script cache:clear [KO]
    [KO]
    Script cache:clear returned with error code 1
    !!
    !! // Clearing the cache for the dev environment with debug
    !! // true
    !!
    !!
    !! In FileLoader.php line 168:
    !!
    !! The file "/home/gmagassa/app-synfony/config/routes.yaml" does not contain v
    !! alid YAML in /home/gmagassa/app-synfony/config/routes.yaml (which is loaded
    !! in resource "/home/gmagassa/app-synfony/config/routes.yaml").
    !!
    !!
    !! In YamlFileLoader.php line 64:
    !!
    !! The file "/home/gmagassa/app-synfony/config/routes.yaml" does not contain v
    !! alid YAML.
    !!
    !!
    !! In Parser.php line 582:
    !!
    !! Indentation problem in "/home/gmagassa/app-synfony/config/routes.yaml" at l
    !! ine 3 (near " controller: App\Controller\DefaultController::index").
    !!
    !!
    !! cache:clear [--no-warmup] [--no-optional-warmers] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command>
    !!
    !!
    Script @auto-scripts was called via post-update-cmd

  • 2018-09-17 weaverryan

    Hey there!

    Yes! This is normal :). We talk about about that symfony.lock file here - https://symfonycasts.com/sc... - but basically, it is a file that keeps track of what recipes have been installed.

    But, I think this isn't really your question - you're probably wondering "Why is this 3.3 when we're working on a Symfony 4 project?". That's a GREAT question. Here's how the recipe system works: when you install symfony/console, it looks at the recipes repository https://github.com/symfony/... for a "recipe" for symfony/console. Every library is allowed to have different recipes for different versions. For example, there could be a different recipe for symfony/console version 3.3 and a different recipe for symfony/console 4.0. But usually, this isn't the case. Check out the symfony/console recipe: https://github.com/symfony/.... There is only 1! And it's for Symfony 3.3. This means that this recipe will be used when symfony/console 3.3 or *higher* is installed. THAT is why you see this number recorded in your symfony.lock file. For contrast, there is an example of a recipe that is different for different versions: https://github.com/symfony/.... In that case, if you installed symfony/debug-bundle at version 3.3, 3.4 or 4.0, you would get the "3.3" recipe. If you installed version 4.1 or higher, you would get the 4.1 recipe.

    Phew! So, great question :).

    Cheers!

  • 2018-09-17 weaverryan

    Hey Ramsey Jiang!

    Hmm. Where (what directory) does your Symfony application live in your computer? Is it in \www? Or is it in some other directory? Wherever you downloaded Symfony, you should *absolutely* have a config/packages/routes.yaml file in that directory. The fact that you don't see that means you may be looking in the wrong place, or something is very wrong.

    Let us know!

    Cheers!

  • 2018-09-14 Studen

    It's normal???:
    # www\symfony.lock
    "symfony/console": {
    "version": "3.3",

  • 2018-09-14 Student

    Need use: composer require symfony/apache-pack
    Yes, it's gen. .htaccess file, but I didn't have this file:
    \www\config\packages\routes.yaml
    I create manual, but output error

    index:
    path: /
    controller: App\Controller\ArticleController::homepage

    Yes, I have Controller too:

  • 2018-08-23 Silvestr Hašek

    Hi Victor,

    first of all thanks for your rapid response, Just for clarification of naming www. It cames from where the app will be deployed. If it's something like api.project.ltd it will be api. I believe this structure will change in future Symfony is build (by the Composer) differently, then I'm used too (No need any future respond)

    Thanks again.

  • 2018-08-23 Victor Bocharsky

    Hey Silvestr,

    Hm, I'n not against creating a subfolder for Symfony project in Git repositories, but the folder name you have a bit mislead me. For me www/ is a folder that should be the document root of your project. But only public/ dir in the Symfony folder should be the document root. But that's just a name, and if you comfort with it - great! Just remember that only public/ directory should be publicly accessible for your web server.

    What about your question: No, you don't need to commit .idea/ folder to your repository, it's personal for every developer, and PhpStorm stores there some internal information that relates to your laptop only. For example, PhpStorm remembers what opened files you have there, and each time you open / close a new file - PhpStorms writes to this directory, so you repository will be in a dirty stage every time you do something in PhpStorm. So you're right, IDE choice is personal, other devs may use another IDE, that's why you should avoid committing this folder to the repo.

    Cheers!

  • 2018-08-23 Silvestr Hašek

    Hello,

    when I opened PHPStorm it generated hidden folder inside mine project folder. To be fair as I'm new to PHPStorm and Symfony, I'm not totally beginner in web development so I started a little bit different from the tutorial, to suit my current needs (I will probably change it in future, it's just old habit of mine :-D)

    /project (git init here)
    -- /www (where Symfony lives as from tutorial)
    -- /.idea (generated by PHPStrom)

    so the question is, should I push .idea folder to git? On Jetbrain support you can read many opinions from don't push to push some only same file. My thoughts are, as I can't guarantee that everyone on the project will work whit PHPStrom it should be better to add the whole folder in .gitignore and not to push.

    But as I pointed before I'm new to PHPStorm and I really don't know what these files are, at least yet.

    Thanks for your recommendation.

  • 2018-08-20 Victor Bocharsky

    Hey Ricard,

    Nice catch! Yes, now it's optional to have "Action" suffix for your actions. Well, it was done just for simplicity and transparency. And because "Bundle:Controller:Action" syntax is deprecated. Btw, you can still use Action suffix, but this way you'll need to explicitly specify it in route configuration when using Yaml/Xml. And you can check related thread here: https://github.com/symfony/...

    Cheers!

  • 2018-08-20 Ricard Espinàs Llovet

    In Symfony 3 all the methods from the controllers were called "somethingAction". I guess in Symfony 4 that's not necessary anymore, isn't it? Could you explain me why this change of behaviour?

  • 2018-07-31 Victor Bocharsky

    Hey Mike,

    Thanks for sharing it with others! And yeah, this one is an easy win :)

    Cheers!

  • 2018-07-31 Mike

    Want to share my experience, SF 4.1.2 Deprecation Message:
    User Deprecated: The "Sensio\Bundle\FrameworkExtraBundle\Configuration\Route" annotation is deprecated since version 5.2. Use "Symfony\Component\Routing\Annotation\Route" instead.

    The solution is pretty obvious, choose the other Route Class :)

  • 2018-07-24 mouad err

    Hello weaverryan
    Thank you for your respond, all what you said is correct, no error after calling an id that's already exist in my DB.

  • 2018-07-23 weaverryan

    Hey mouad err!

    Ah, yes! My guess is that your controller method has an argument that is type-hinted with Article - something like this:


    public function index(Article $article)

    Because the Article class is a Doctrine entity, Symfony tries to automatically query for the Article from the database, by using some information from the route. Usually, you have a route that looks like this:


    /**
    * @Route("/article/{id}")
    */
    public function index(Article $article)

    And so when you go to /article/10, Symfony tries to find the Article with id 10. The error you are receiving - if you use the code from my example - is because it cannot find any Article in the database with id 10. In this chapter, we aren't using Doctrine yet, and we don't have an Article class - so you shouldn't be getting this error.

    Basically, if you really DO want to query for an Article object, this error is fine: it just means it can't find that Article object in the database. If you are NOT trying to query for an Article (maybe you copy and pasted some code), just remove that argument.

    Cheers!

  • 2018-07-23 mouad err

    I have this issue and i don't know how to solve it.
    App\Entity\Article object not found by the @ParamConverter annotation.

  • 2018-06-26 Diego Aguiar

    Awesome! I hope you are enjoying your time at KnpUniversity :)

  • 2018-06-26 Luma Macagnan

    Yep, I made a search and found it before! That's nice, I'm pretty sure I'll check it out. Kind regards.

  • 2018-06-25 Diego Aguiar

    Hey Luma Macagnan

    Thanks for the compliment!

    We are focused on PHP & Symfony, but we do have some courses about Javascript, how to create a REST API, ReactJS, Gulp, Ansible, and more. You can check our entire list of courses here: https://knpuniversity.com/c...

    If you have any other doubt or concern, don't hesitate to contact us.

    Saúde!

  • 2018-06-25 Luma Macagnan

    Amazing tutorial, thank you! You guys make it really fun and easy to understand.

  • 2018-03-22 Tess Hsu

    God, thank Victor, yes, it is work after correct the controller name, sorry again

  • 2018-03-22 Victor Bocharsky

    Hey Tess,

    A simple mistake: your controller's name is "MenuControllerController" but should be just "MenuController" ;)

    Cheers!

  • 2018-03-21 Tess Hsu

    Hi,
    I wonder if someone had try to add another controller to play with,

    My steps is followed:
    1 add A new controller called MenuController.php under src/Controller/


    namespace App\Controller;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

    class MenuControllerController extends AbstractController
    {
    /**
    * @Route("/about", name="app_aboutpage")
    */
    public function aboutpage()
    {
    return $this->render('article/aboutpage.html.twig');
    }
    }

    2 Add template in article/aboutpage.html.twig


    {% extends 'base.html.twig' %}

    {% block body %}
    <div class="container">
    <div class="row">

    <div class="row">
    test create about page
    </div>
    </div>
    </div>
    {% endblock %}

    3 modify this path in base.html.twig


    <li class="nav-item">
    <a style="color: #fff;" class="nav-link" href="{{ path('app_aboutpage') }}">About</a>
    </li>


    Then run server and it is show error message:

    FileLoaderLoadException
    The autoloader expected class "App\Controller\MenuController" to be defined in file "/Users/webdev/Documents/dossier_web/symfony/the_spacebar/vendor/composer/../../src/Controller/MenuController.php". The file was found but the class was not in it, the class name or namespace probably has a typo in /Users/webdev/Documents/dossier_web/symfony/the_spacebar/config/services.yaml (which is loaded in resource "/Users/webdev/Documents/dossier_web/symfony/the_spacebar/config/services.yaml").

    It is possible to know where did i doing wrong since I just want to do: add a Controller-> make about link to go to http://127.0.0.1:8000/about

    thank you so much advanced

  • 2018-03-13 Agung

    Hey, i also have the same error, for the route "/" is no problem, for route "/news/..." give error message, after i check there is some kind a silly mistake that i have done. After you install annotations composer will generate annotations.yaml in routes folder, and i accidentally comment it (the one you should comment is routes.yaml). I hope this will help.

  • 2018-02-09 Diego Aguiar

    Hey Mohammad

    On Symfony4 you have to install "apache-pack" https://packagist.org/packa...
    it will generate a ".htaccess" file at your public directory, so you have to configure your apache to allow overrides

    Cheers!

  • 2018-02-09 Mohammad

    I am having the same issue. I am using Vagrant and running apache on it, I have Symfony3 project and I have the symfony4 on the same server. Symfony3 has no issue while Symfony4 is not working well.

    The error is from the server, the server throw 404 on all internal pages.I know this issue happen when your apache is not configured right and you forgot the to configure the Directory.., but it is different here bcz I have the apache conf correct.

    What is making me more crazy is that I am using PHPUnit testing and the test is able to reach the internal page url but when I use the browser it throw 404, also ajax calls throw 404.

  • 2018-02-08 Ramsey Jiang

    It can find it. I fix it though I don't know why it is suddenly fixed.

  • 2018-02-08 Diego Aguiar

    Oh boy, you ain't gonna believe it, just move up your method "news" right before "showAction". The problem is that Symfony returns the first route that matches the request, and since your route "@Route("/{id}"..." is defined first and has a wildcard, then your other route "@Route("/news/{slug}")" will never be found.

    I hope it makes sense to you :)
    Cheers!

  • 2018-02-08 Ramsey Jiang

    Hey Diego,

    I can hit other routes.

    For example, the following codes I can access them.
    /**
    * @Route("/")
    */
    public function indexAction()
    {
    return new Response('OMG! My first page already! Wooooo!');
    }

    /**
    * @Route("/{id}", requirements={"id" = "\d+"}, defaults={"id" = 1})
    */
    public function showAction($id)
    {
    return new Response('The number is '. $id);
    }

    But I cannot access the next one.

    /**
    * @Route("/news/{slug}")
    */
    public function news($slug)
    {
    return new Response(sprintf('Today new is "%s"', $slug));
    }

    I've already generated .htaccess, but it still not work. Whether I need to modify .htaccess a little bit?

  • 2018-02-08 Diego Aguiar

    Hey Ramsey Jiang

    Can you hit any other route? Let me see your routing configuration.
    One more thing, maybe your ".htaccess" file is not being read by Apache, you need to add this directive into your VirtualHost config "AllowOverride All"

    Cheers!

  • 2018-02-08 Ramsey Jiang

    Hey @weaverryan

    I did that before. Yes, it generate .htaccess automatically, but http://127.0.0.1:8000/index.php/news/test still not work. Should I change somthing in .htaccess file?

  • 2018-02-07 weaverryan

    Hey Ramsey Jiang!

    Just run "composer require symfony/apache-pack". That will install a package with a recipe that will add the public/.htaccess file for you :).

    Cheers!

  • 2018-02-07 locad5

    Hey Jiang,
    if you use http://127.0.0.1:8000/news/test you work with internal web server and not apache server, you should not need the .htaccess file. Look at the routing definition,
    Cheers

  • 2018-02-07 Ramsey Jiang

    Hi Victor,

    No route found for "GET /news/scas". I use an apache server. But I don't know how modify .htaccess for it. Can you help me please?

  • 2018-02-06 Victor Bocharsky

    Hey Ramsey,

    What error do you have? Is it a Symfony error? Can you try http://127.0.0.1:8000/index.php/news/test ? Does it work? Sometimes .htaccess should be slightly tweaked in different way on different servers.

    Cheers!

  • 2018-02-06 Ramsey Jiang

    Hey @locad5
    I met the same issue. I run composer symphony/apache-pack, and it generated .htaccess. But 127.0.0.1:8000/news/test is still not work. How do you change the file of .htaccess?

  • 2018-01-18 Victor Bocharsky

    Hey locad5 ,

    Take a look at makx21 answer, probably it will give you some clarification and maybe that's your case: https://knpuniversity.com/s... . It's also depends on what version of "apache-pack" you requires, it should be one of 1.0.x as I see from contrib repo: https://github.com/symfony/...

    Cheers!

  • 2018-01-18 Victor Bocharsky

    Hey makx21,

    Good point! Thanks for sharing it with us. You can set extra.symfony.allow-contrib to true manually or by following interactive questions during the Composer installation process.

    Cheers!

  • 2018-01-18 makx21

    This is a contributed recipe, you
    will need to allow flex to use them if you haven't previously.

    composer config extra.symfony.allow-contrib true

  • 2018-01-18 Diego Aguiar

    Hmm, interesting, I thought it was related to a composer's bug from a previous version, but you are using composer's latest version, so that's not the case.
    I wonder what caused that weird behaviour...

  • 2018-01-17 locad5

    Hey Diego Aguiar
    Composer version 1.6.2
    Mac OS High Sierra version 10.13.2

  • 2018-01-17 Diego Aguiar

    Hey locad5

    That's weird, can you tell me which composer version and which OS are you using?

  • 2018-01-17 locad5

    Hey weaverryan,
    Thank for your quick response, I already run composer symphony/apache-pack, but the .htaccess was not generated automatically. I put a basic .htaccess file inside /public folder and it works now.
    Thanks for your help
    Cheers!

  • 2018-01-17 weaverryan

    Hey locad5!

    I think you just may be missing the Apache rewrite rules that tell Apache to always use execute index.php file, regardless of the URL. Fortunately, Flex can add the .htaccess file you need automatically. Run composer require symfony/apache-pack.

    Let me know if that helps!

    Cheers!

  • 2018-01-17 locad5

    Hi,
    it works with http://localhost:8000/ and it's equivalent as http://localhost/advert/public for production apache environment, using PHP annotations or not.

    However, for any other routes like http://localhost/advert/public/goodbye, apache answers 'The requested URL /advert/public/goodbye was not found on this server.'

    Using this route:

    /**
    * @Route("/goodbye")
    */

    Do you have an idea ?
    Thanks

  • 2018-01-17 elbarto

    thanks for the answer :)

  • 2018-01-16 Diego Aguiar

    Hey @elbarto (or Bart Simpson :P)

    Doctrine devs never implemented it to work in both ways

    Cheers!

  • 2018-01-16 elbarto

    Hi,

    Shouldn't it work as well when we specify the route (using annotations) with simple quotes ?
    @Route('/' , name='homepage')

    because using simple quotes gives me an error : [Syntax Error] Expected PlainValue, got ''' at position 7 in method App\Controller\HomeController::homepage()

  • 2018-01-09 Diego Aguiar

    Hey Ivan Mauricio Rey

    This tutorial is still been released, i.e. only a few chapters has a video
    If you check in the chapter's list, it says "coming soon", but maybe we should make it more visible :)

    Cheers!

  • 2018-01-09 Ivan Mauricio Rey

    There is no video on this chapter?