I like solution 1, considering that Symfony2 is aiming to be a more verbose
framework, indicating that a resource is a file wont hurt?



t

On Tue, Nov 30, 2010 at 18:42, Fabien Potencier <
fabien.potenc...@symfony-project.com> wrote:

> Hi all,
>
> Time for another RFC. Today, I want your opinion on custom loader resources
> notation.
>
> As you might know, the Dependency Injection and Routing components have the
> notion of loaders. A loader is able to load "resource"s. A resource can be
> anything; write a loader that knows how to load the resource and you're good
> to go. Both components comes with built-in file loaders for XML, YAML, and
> PHP:
>
> # config.yml
> imports:
>  - { resource: security.yml }
>
> # routing.yml
> imports
>  - { resource: BlogBundle/Resources/config/routing.xml, prefix: /blog }
>
> The interesting part is that a resource is not necessarily a file. Of
> course, most of the time, this is part of a file path, but it does not need
> to.
>
> For instance, if you have a look at the Routing component and the
> FrameworkExtraBundle documentation, you will see that there is a special
> "annotation" loader. For this annotation loader, the resource is not a file
> path but it can be a glob or a directory of files to parse for annotations:
>
> imports:
>  - { resource: annotations:BlogBundle/Controller/AnnotController.php }
>
> As you can see, the current convention is to to prefix the "real" resource
> by a word followed by a colon, here "annotations:".
>
> Symfony2 determines the loader to use via a LoaderResolverInterface
> instance. Here is the default implementation of this interface:
>
>    public function resolve($resource)
>    {
>        foreach ($this->loaders as $loader) {
>            if ($loader->supports($resource)) {
>                return $loader;
>            }
>        }
>
>        return false;
>    }
>
> So, each loader has a supports() method that must return true if it is able
> to load the resource. Here is for instance the supports() method for the PHP
> and XML loader:
>
>    // PHP
>    public function supports($resource)
>    {
>        return is_string($resource)
>          && 'php' === pathinfo($resource, PATHINFO_EXTENSION)
>          && is_file($this->getAbsolutePath($resource));
>    }
>
>    // XML
>    public function supports($resource)
>    {
>        return is_string($resource)
>          && 'xml' === pathinfo($resource, PATHINFO_EXTENSION);
>    }
>
> As you can see, for the annotation loader to work, the PHP loader checks if
> the resource is actually an existing file; which is not the case for XML
> loader.
>
> I had to do that because of the registration order. If you remove the
> 'is_file' check in the PHP loader and register the annotation loader after
> the PHP one, the PHP loader will always "win" but won't be able to do
> anything useful with the resource.
>
> So, we need a way to clearly identify which loader need to be used. The
> current implementation of the PHP loader is a "hack" as you won't have a
> proper exception if you want to load a PHP resource and if you make a typo
> in the file path because the loader will tell the resolver that it does not
> support the resource. So, you will have an exception saying that there is no
> loader able to load your resource, which is not the real problem (you have a
> typo in the file path).
>
> everzet had the same problem and came up with a patch:
> https://github.com/fabpot/symfony/pull/178
>
> In this pull request, we talked about the prefix to use, and one proposal
> (the one implemented in the patch) was to use (), as they cannot be used at
> the beginning of a real file path. So, to create a custom loader, you need
> prefix the resource like this:
>
> imports:
>  - { resource: (annotations) BlogBundle/Controller/AnnotController.php }
>
> I was about to merge the change and then I step back and found this
> convention quite ugly (I was the one to propose that).
>
> I thought about that more and here are some proposals:
>
> 1/ Always prefix the path with something, even for file resources (like a
> DSN):
>
> imports:
>  - { resource: file:BlogBundle/Controller/AnnotController.php }
>  - { resource: annotations:BlogBundle/Controller/AnnotController.php }
>
>  * This is explicit, no ambiguity possible, simple supports()
> implementation, clear error messages;
>  * But when using a file as a resource, which is what you will do most of
> the time, you will have to use the 'file:' prefix.
>
> 2/ Use a prefix for everything except file loaders
>
> For this one, we need to come up with a convention that can be easily
> checked and cannot be part of a file name:
>
>  (annotations) BlogBundle/Controller/AnnotController.php
>  annotations::BlogBundle/Controller/AnnotController.php
>  [annotations]BlogBundle/Controller/AnnotController.php
>  ...
>
> 3/ You own idea here ;)
>
> Fabien
>
> --
> Fabien Potencier
> Sensio CEO - symfony lead developer
> sensiolabs.com | symfony-project.org | fabien.potencier.org
> Tél: +33 1 40 99 80 80
>
> --
> If you want to report a vulnerability issue on symfony, please send it to
> security at symfony-project.com
>
> You received this message because you are subscribed to the Google
> Groups "symfony developers" group.
> To post to this group, send email to symfony-devs@googlegroups.com
> To unsubscribe from this group, send email to
> symfony-devs+unsubscr...@googlegroups.com<symfony-devs%2bunsubscr...@googlegroups.com>
> For more options, visit this group at
> http://groups.google.com/group/symfony-devs?hl=en
>

-- 
If you want to report a vulnerability issue on symfony, please send it to 
security at symfony-project.com

You received this message because you are subscribed to the Google
Groups "symfony developers" group.
To post to this group, send email to symfony-devs@googlegroups.com
To unsubscribe from this group, send email to
symfony-devs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/symfony-devs?hl=en

Reply via email to